Add git cherry picking extension
This extension uploads a fake cherry pick-style diff to rietveld with a modified project parameter. The modified project is intended to be used by the commit queue to attempt to land the change on a branch. This works by grabbing the parent of the targeted revision and generating the diff. It is intended to be used to CQ trivial cherry picks which apply cleanly on top of other branches without conflicts. BUG=387111 Review URL: https://codereview.chromium.org/397593004 git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@286273 0039d316-1c4b-4281-b951-d872f2087c98changes/01/332501/1
parent
fbfecb72a5
commit
cd1e3d4092
@ -0,0 +1,8 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Copyright 2014 The Chromium Authors. All rights reserved.
|
||||||
|
# Use of this source code is governed by a BSD-style license that can be
|
||||||
|
# found in the LICENSE file.
|
||||||
|
|
||||||
|
# git_cherry_pick_upload.py -- Upload a cherry pick CL to rietveld.
|
||||||
|
|
||||||
|
. $(type -P python_git_runner.sh)
|
@ -0,0 +1,144 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# Copyright 2014 The Chromium Authors. All rights reserved.
|
||||||
|
# Use of this source code is governed by a BSD-style license that can be
|
||||||
|
# found in the LICENSE file.
|
||||||
|
|
||||||
|
"""Upload a cherry pick CL to rietveld."""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import md5
|
||||||
|
import subprocess2
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from git_cl import Changelist
|
||||||
|
from git_common import config, run
|
||||||
|
from third_party.upload import EncodeMultipartFormData, GitVCS
|
||||||
|
from rietveld import Rietveld
|
||||||
|
|
||||||
|
|
||||||
|
def cherry_pick(target_branch, commit):
|
||||||
|
"""Attempt to upload a cherry pick CL to rietveld.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
target_branch: The branch to cherry pick onto.
|
||||||
|
commit: The git hash of the commit to cherry pick.
|
||||||
|
"""
|
||||||
|
author = config('user.email')
|
||||||
|
|
||||||
|
description = '%s\n\n(cherry picked from commit %s)\n' % (
|
||||||
|
run('show', '--pretty=%B', '--quiet', commit), commit)
|
||||||
|
|
||||||
|
parent = run('show', '--pretty=%P', '--quiet', commit)
|
||||||
|
print 'Found parent revision:', parent
|
||||||
|
|
||||||
|
class Options(object):
|
||||||
|
def __init__(self):
|
||||||
|
self.emulate_svn_auto_props = False
|
||||||
|
|
||||||
|
content_type, payload = EncodeMultipartFormData([
|
||||||
|
('base', '%s@%s' % (Changelist().GetRemoteUrl(), target_branch)),
|
||||||
|
('cc', config('rietveld.cc')),
|
||||||
|
('content_upload', '1'),
|
||||||
|
('description', description),
|
||||||
|
('project', '%s@%s' % (config('rietveld.project'), target_branch)),
|
||||||
|
('subject', description.splitlines()[0]),
|
||||||
|
('user', author),
|
||||||
|
], [
|
||||||
|
('data', 'data.diff', GitVCS(Options()).PostProcessDiff(
|
||||||
|
run('diff', parent, commit))),
|
||||||
|
])
|
||||||
|
|
||||||
|
rietveld = Rietveld(config('rietveld.server'), author, None)
|
||||||
|
# pylint: disable=W0212
|
||||||
|
output = rietveld._send(
|
||||||
|
'/upload',
|
||||||
|
payload=payload,
|
||||||
|
content_type=content_type,
|
||||||
|
).splitlines()
|
||||||
|
|
||||||
|
# If successful, output will look like:
|
||||||
|
# Issue created. URL: https://codereview.chromium.org/1234567890
|
||||||
|
# 1
|
||||||
|
# 10001 some/path/first.file
|
||||||
|
# 10002 some/path/second.file
|
||||||
|
# 10003 some/path/third.file
|
||||||
|
|
||||||
|
if output[0].startswith('Issue created. URL: '):
|
||||||
|
print output[0]
|
||||||
|
issue = output[0].rsplit('/', 1)[-1]
|
||||||
|
patchset = output[1]
|
||||||
|
files = output[2:]
|
||||||
|
|
||||||
|
for f in files:
|
||||||
|
file_id, filename = f.split()
|
||||||
|
mode = 'M'
|
||||||
|
|
||||||
|
try:
|
||||||
|
content = run('show', '%s:%s' % (parent, filename))
|
||||||
|
except subprocess2.CalledProcessError:
|
||||||
|
# File didn't exist in the parent revision.
|
||||||
|
content = ''
|
||||||
|
mode = 'A'
|
||||||
|
|
||||||
|
content_type, payload = EncodeMultipartFormData([
|
||||||
|
('checksum', md5.md5(content).hexdigest()),
|
||||||
|
('filename', filename),
|
||||||
|
('is_current', 'False'),
|
||||||
|
('status', mode),
|
||||||
|
], [
|
||||||
|
('data', filename, content),
|
||||||
|
])
|
||||||
|
|
||||||
|
# pylint: disable=W0212
|
||||||
|
print ' Uploading base file for %s:' % filename, rietveld._send(
|
||||||
|
'/%s/upload_content/%s/%s' % (issue, patchset, file_id),
|
||||||
|
payload=payload,
|
||||||
|
content_type=content_type,
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
content = run('show', '%s:%s' % (commit, filename))
|
||||||
|
except subprocess2.CalledProcessError:
|
||||||
|
# File no longer exists in the new commit.
|
||||||
|
content = ''
|
||||||
|
mode = 'D'
|
||||||
|
|
||||||
|
content_type, payload = EncodeMultipartFormData([
|
||||||
|
('checksum', md5.md5(content).hexdigest()),
|
||||||
|
('filename', filename),
|
||||||
|
('is_current', 'True'),
|
||||||
|
('status', mode),
|
||||||
|
], [
|
||||||
|
('data', filename, content),
|
||||||
|
])
|
||||||
|
|
||||||
|
# pylint: disable=W0212
|
||||||
|
print ' Uploading %s:' % filename, rietveld._send(
|
||||||
|
'/%s/upload_content/%s/%s' % (issue, patchset, file_id),
|
||||||
|
payload=payload,
|
||||||
|
content_type=content_type,
|
||||||
|
)
|
||||||
|
|
||||||
|
# pylint: disable=W0212
|
||||||
|
print 'Finalizing upload:', rietveld._send('/%s/upload_complete/1' % issue)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument(
|
||||||
|
'--branch',
|
||||||
|
'-b',
|
||||||
|
help='The upstream branch to cherry pick to.',
|
||||||
|
metavar='<branch>',
|
||||||
|
required=True,
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'commit',
|
||||||
|
help='SHA to cherry pick.',
|
||||||
|
metavar='<commit>',
|
||||||
|
)
|
||||||
|
args = parser.parse_args()
|
||||||
|
cherry_pick(args.branch, args.commit)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.exit(main())
|
@ -0,0 +1,824 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
||||||
|
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
|
||||||
|
<meta name="generator" content="AsciiDoc 8.6.9" />
|
||||||
|
<title>git-cherry-pick-upload(1)</title>
|
||||||
|
<style type="text/css">
|
||||||
|
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
|
||||||
|
|
||||||
|
/* Default font. */
|
||||||
|
body {
|
||||||
|
font-family: Georgia,serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Title font. */
|
||||||
|
h1, h2, h3, h4, h5, h6,
|
||||||
|
div.title, caption.title,
|
||||||
|
thead, p.table.header,
|
||||||
|
#toctitle,
|
||||||
|
#author, #revnumber, #revdate, #revremark,
|
||||||
|
#footer {
|
||||||
|
font-family: Arial,Helvetica,sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 1em 5% 1em 5%;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: blue;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
a:visited {
|
||||||
|
color: fuchsia;
|
||||||
|
}
|
||||||
|
|
||||||
|
em {
|
||||||
|
font-style: italic;
|
||||||
|
color: navy;
|
||||||
|
}
|
||||||
|
|
||||||
|
strong {
|
||||||
|
font-weight: bold;
|
||||||
|
color: #083194;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5, h6 {
|
||||||
|
color: #527bbd;
|
||||||
|
margin-top: 1.2em;
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
line-height: 1.3;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2, h3 {
|
||||||
|
border-bottom: 2px solid silver;
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
padding-top: 0.5em;
|
||||||
|
}
|
||||||
|
h3 {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
h3 + * {
|
||||||
|
clear: left;
|
||||||
|
}
|
||||||
|
h5 {
|
||||||
|
font-size: 1.0em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sectionbody {
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr {
|
||||||
|
border: 1px solid silver;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin-top: 0.5em;
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul, ol, li > p {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
ul > li { color: #aaa; }
|
||||||
|
ul > li > * { color: black; }
|
||||||
|
|
||||||
|
.monospaced, code, pre {
|
||||||
|
font-family: "Courier New", Courier, monospace;
|
||||||
|
font-size: inherit;
|
||||||
|
color: navy;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
pre {
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
#author {
|
||||||
|
color: #527bbd;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 1.1em;
|
||||||
|
}
|
||||||
|
#email {
|
||||||
|
}
|
||||||
|
#revnumber, #revdate, #revremark {
|
||||||
|
}
|
||||||
|
|
||||||
|
#footer {
|
||||||
|
font-size: small;
|
||||||
|
border-top: 2px solid silver;
|
||||||
|
padding-top: 0.5em;
|
||||||
|
margin-top: 4.0em;
|
||||||
|
}
|
||||||
|
#footer-text {
|
||||||
|
float: left;
|
||||||
|
padding-bottom: 0.5em;
|
||||||
|
}
|
||||||
|
#footer-badges {
|
||||||
|
float: right;
|
||||||
|
padding-bottom: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#preamble {
|
||||||
|
margin-top: 1.5em;
|
||||||
|
margin-bottom: 1.5em;
|
||||||
|
}
|
||||||
|
div.imageblock, div.exampleblock, div.verseblock,
|
||||||
|
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
|
||||||
|
div.admonitionblock {
|
||||||
|
margin-top: 1.0em;
|
||||||
|
margin-bottom: 1.5em;
|
||||||
|
}
|
||||||
|
div.admonitionblock {
|
||||||
|
margin-top: 2.0em;
|
||||||
|
margin-bottom: 2.0em;
|
||||||
|
margin-right: 10%;
|
||||||
|
color: #606060;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.content { /* Block element content. */
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Block element titles. */
|
||||||
|
div.title, caption.title {
|
||||||
|
color: #527bbd;
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: left;
|
||||||
|
margin-top: 1.0em;
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
}
|
||||||
|
div.title + * {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
td div.title:first-child {
|
||||||
|
margin-top: 0.0em;
|
||||||
|
}
|
||||||
|
div.content div.title:first-child {
|
||||||
|
margin-top: 0.0em;
|
||||||
|
}
|
||||||
|
div.content + div.title {
|
||||||
|
margin-top: 0.0em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.sidebarblock > div.content {
|
||||||
|
background: #ffffee;
|
||||||
|
border: 1px solid #dddddd;
|
||||||
|
border-left: 4px solid #f0f0f0;
|
||||||
|
padding: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.listingblock > div.content {
|
||||||
|
border: 1px solid #dddddd;
|
||||||
|
border-left: 5px solid #f0f0f0;
|
||||||
|
background: #f8f8f8;
|
||||||
|
padding: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.quoteblock, div.verseblock {
|
||||||
|
padding-left: 1.0em;
|
||||||
|
margin-left: 1.0em;
|
||||||
|
margin-right: 10%;
|
||||||
|
border-left: 5px solid #f0f0f0;
|
||||||
|
color: #888;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.quoteblock > div.attribution {
|
||||||
|
padding-top: 0.5em;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.verseblock > pre.content {
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: inherit;
|
||||||
|
}
|
||||||
|
div.verseblock > div.attribution {
|
||||||
|
padding-top: 0.75em;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
|
||||||
|
div.verseblock + div.attribution {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.admonitionblock .icon {
|
||||||
|
vertical-align: top;
|
||||||
|
font-size: 1.1em;
|
||||||
|
font-weight: bold;
|
||||||
|
text-decoration: underline;
|
||||||
|
color: #527bbd;
|
||||||
|
padding-right: 0.5em;
|
||||||
|
}
|
||||||
|
div.admonitionblock td.content {
|
||||||
|
padding-left: 0.5em;
|
||||||
|
border-left: 3px solid #dddddd;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.exampleblock > div.content {
|
||||||
|
border-left: 3px solid #dddddd;
|
||||||
|
padding-left: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.imageblock div.content { padding-left: 0; }
|
||||||
|
span.image img { border-style: none; vertical-align: text-bottom; }
|
||||||
|
a.image:visited { color: white; }
|
||||||
|
|
||||||
|
dl {
|
||||||
|
margin-top: 0.8em;
|
||||||
|
margin-bottom: 0.8em;
|
||||||
|
}
|
||||||
|
dt {
|
||||||
|
margin-top: 0.5em;
|
||||||
|
margin-bottom: 0;
|
||||||
|
font-style: normal;
|
||||||
|
color: navy;
|
||||||
|
}
|
||||||
|
dd > *:first-child {
|
||||||
|
margin-top: 0.1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul, ol {
|
||||||
|
list-style-position: outside;
|
||||||
|
}
|
||||||
|
ol.arabic {
|
||||||
|
list-style-type: decimal;
|
||||||
|
}
|
||||||
|
ol.loweralpha {
|
||||||
|
list-style-type: lower-alpha;
|
||||||
|
}
|
||||||
|
ol.upperalpha {
|
||||||
|
list-style-type: upper-alpha;
|
||||||
|
}
|
||||||
|
ol.lowerroman {
|
||||||
|
list-style-type: lower-roman;
|
||||||
|
}
|
||||||
|
ol.upperroman {
|
||||||
|
list-style-type: upper-roman;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.compact ul, div.compact ol,
|
||||||
|
div.compact p, div.compact p,
|
||||||
|
div.compact div, div.compact div {
|
||||||
|
margin-top: 0.1em;
|
||||||
|
margin-bottom: 0.1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
tfoot {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
td > div.verse {
|
||||||
|
white-space: pre;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.hdlist {
|
||||||
|
margin-top: 0.8em;
|
||||||
|
margin-bottom: 0.8em;
|
||||||
|
}
|
||||||
|
div.hdlist tr {
|
||||||
|
padding-bottom: 15px;
|
||||||
|
}
|
||||||
|
dt.hdlist1.strong, td.hdlist1.strong {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
td.hdlist1 {
|
||||||
|
vertical-align: top;
|
||||||
|
font-style: normal;
|
||||||
|
padding-right: 0.8em;
|
||||||
|
color: navy;
|
||||||
|
}
|
||||||
|
td.hdlist2 {
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
div.hdlist.compact tr {
|
||||||
|
margin: 0;
|
||||||
|
padding-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.comment {
|
||||||
|
background: yellow;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footnote, .footnoteref {
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.footnote, span.footnoteref {
|
||||||
|
vertical-align: super;
|
||||||
|
}
|
||||||
|
|
||||||
|
#footnotes {
|
||||||
|
margin: 20px 0 20px 0;
|
||||||
|
padding: 7px 0 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#footnotes div.footnote {
|
||||||
|
margin: 0 0 5px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#footnotes hr {
|
||||||
|
border: none;
|
||||||
|
border-top: 1px solid silver;
|
||||||
|
height: 1px;
|
||||||
|
text-align: left;
|
||||||
|
margin-left: 0;
|
||||||
|
width: 20%;
|
||||||
|
min-width: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.colist td {
|
||||||
|
padding-right: 0.5em;
|
||||||
|
padding-bottom: 0.3em;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
div.colist td img {
|
||||||
|
margin-top: 0.3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
#footer-badges { display: none; }
|
||||||
|
}
|
||||||
|
|
||||||
|
#toc {
|
||||||
|
margin-bottom: 2.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#toctitle {
|
||||||
|
color: #527bbd;
|
||||||
|
font-size: 1.1em;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-top: 1.0em;
|
||||||
|
margin-bottom: 0.1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
div.toclevel2 {
|
||||||
|
margin-left: 2em;
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
div.toclevel3 {
|
||||||
|
margin-left: 4em;
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
div.toclevel4 {
|
||||||
|
margin-left: 6em;
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.aqua { color: aqua; }
|
||||||
|
span.black { color: black; }
|
||||||
|
span.blue { color: blue; }
|
||||||
|
span.fuchsia { color: fuchsia; }
|
||||||
|
span.gray { color: gray; }
|
||||||
|
span.green { color: green; }
|
||||||
|
span.lime { color: lime; }
|
||||||
|
span.maroon { color: maroon; }
|
||||||
|
span.navy { color: navy; }
|
||||||
|
span.olive { color: olive; }
|
||||||
|
span.purple { color: purple; }
|
||||||
|
span.red { color: red; }
|
||||||
|
span.silver { color: silver; }
|
||||||
|
span.teal { color: teal; }
|
||||||
|
span.white { color: white; }
|
||||||
|
span.yellow { color: yellow; }
|
||||||
|
|
||||||
|
span.aqua-background { background: aqua; }
|
||||||
|
span.black-background { background: black; }
|
||||||
|
span.blue-background { background: blue; }
|
||||||
|
span.fuchsia-background { background: fuchsia; }
|
||||||
|
span.gray-background { background: gray; }
|
||||||
|
span.green-background { background: green; }
|
||||||
|
span.lime-background { background: lime; }
|
||||||
|
span.maroon-background { background: maroon; }
|
||||||
|
span.navy-background { background: navy; }
|
||||||
|
span.olive-background { background: olive; }
|
||||||
|
span.purple-background { background: purple; }
|
||||||
|
span.red-background { background: red; }
|
||||||
|
span.silver-background { background: silver; }
|
||||||
|
span.teal-background { background: teal; }
|
||||||
|
span.white-background { background: white; }
|
||||||
|
span.yellow-background { background: yellow; }
|
||||||
|
|
||||||
|
span.big { font-size: 2em; }
|
||||||
|
span.small { font-size: 0.6em; }
|
||||||
|
|
||||||
|
span.underline { text-decoration: underline; }
|
||||||
|
span.overline { text-decoration: overline; }
|
||||||
|
span.line-through { text-decoration: line-through; }
|
||||||
|
|
||||||
|
div.unbreakable { page-break-inside: avoid; }
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* xhtml11 specific
|
||||||
|
*
|
||||||
|
* */
|
||||||
|
|
||||||
|
div.tableblock {
|
||||||
|
margin-top: 1.0em;
|
||||||
|
margin-bottom: 1.5em;
|
||||||
|
}
|
||||||
|
div.tableblock > table {
|
||||||
|
border: 3px solid #527bbd;
|
||||||
|
}
|
||||||
|
thead, p.table.header {
|
||||||
|
font-weight: bold;
|
||||||
|
color: #527bbd;
|
||||||
|
}
|
||||||
|
p.table {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
/* Because the table frame attribute is overriden by CSS in most browsers. */
|
||||||
|
div.tableblock > table[frame="void"] {
|
||||||
|
border-style: none;
|
||||||
|
}
|
||||||
|
div.tableblock > table[frame="hsides"] {
|
||||||
|
border-left-style: none;
|
||||||
|
border-right-style: none;
|
||||||
|
}
|
||||||
|
div.tableblock > table[frame="vsides"] {
|
||||||
|
border-top-style: none;
|
||||||
|
border-bottom-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* html5 specific
|
||||||
|
*
|
||||||
|
* */
|
||||||
|
|
||||||
|
table.tableblock {
|
||||||
|
margin-top: 1.0em;
|
||||||
|
margin-bottom: 1.5em;
|
||||||
|
}
|
||||||
|
thead, p.tableblock.header {
|
||||||
|
font-weight: bold;
|
||||||
|
color: #527bbd;
|
||||||
|
}
|
||||||
|
p.tableblock {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
table.tableblock {
|
||||||
|
border-width: 3px;
|
||||||
|
border-spacing: 0px;
|
||||||
|
border-style: solid;
|
||||||
|
border-color: #527bbd;
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
th.tableblock, td.tableblock {
|
||||||
|
border-width: 1px;
|
||||||
|
padding: 4px;
|
||||||
|
border-style: solid;
|
||||||
|
border-color: #527bbd;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.tableblock.frame-topbot {
|
||||||
|
border-left-style: hidden;
|
||||||
|
border-right-style: hidden;
|
||||||
|
}
|
||||||
|
table.tableblock.frame-sides {
|
||||||
|
border-top-style: hidden;
|
||||||
|
border-bottom-style: hidden;
|
||||||
|
}
|
||||||
|
table.tableblock.frame-none {
|
||||||
|
border-style: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
th.tableblock.halign-left, td.tableblock.halign-left {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
th.tableblock.halign-center, td.tableblock.halign-center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
th.tableblock.halign-right, td.tableblock.halign-right {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
th.tableblock.valign-top, td.tableblock.valign-top {
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
th.tableblock.valign-middle, td.tableblock.valign-middle {
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
th.tableblock.valign-bottom, td.tableblock.valign-bottom {
|
||||||
|
vertical-align: bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* manpage specific
|
||||||
|
*
|
||||||
|
* */
|
||||||
|
|
||||||
|
body.manpage h1 {
|
||||||
|
padding-top: 0.5em;
|
||||||
|
padding-bottom: 0.5em;
|
||||||
|
border-top: 2px solid silver;
|
||||||
|
border-bottom: 2px solid silver;
|
||||||
|
}
|
||||||
|
body.manpage h2 {
|
||||||
|
border-style: none;
|
||||||
|
}
|
||||||
|
body.manpage div.sectionbody {
|
||||||
|
margin-left: 3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
body.manpage div#toc { display: none; }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
div.listingblock > div.content {
|
||||||
|
background: rgb(28, 28, 28);
|
||||||
|
}
|
||||||
|
|
||||||
|
div.listingblock > div > pre > code {
|
||||||
|
color: rgb(187, 187, 187);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script type="text/javascript">
|
||||||
|
/*<+'])');
|
||||||
|
// Function that scans the DOM tree for header elements (the DOM2
|
||||||
|
// nodeIterator API would be a better technique but not supported by all
|
||||||
|
// browsers).
|
||||||
|
var iterate = function (el) {
|
||||||
|
for (var i = el.firstChild; i != null; i = i.nextSibling) {
|
||||||
|
if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
|
||||||
|
var mo = re.exec(i.tagName);
|
||||||
|
if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
|
||||||
|
result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
|
||||||
|
}
|
||||||
|
iterate(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
iterate(el);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
var toc = document.getElementById("toc");
|
||||||
|
if (!toc) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete existing TOC entries in case we're reloading the TOC.
|
||||||
|
var tocEntriesToRemove = [];
|
||||||
|
var i;
|
||||||
|
for (i = 0; i < toc.childNodes.length; i++) {
|
||||||
|
var entry = toc.childNodes[i];
|
||||||
|
if (entry.nodeName.toLowerCase() == 'div'
|
||||||
|
&& entry.getAttribute("class")
|
||||||
|
&& entry.getAttribute("class").match(/^toclevel/))
|
||||||
|
tocEntriesToRemove.push(entry);
|
||||||
|
}
|
||||||
|
for (i = 0; i < tocEntriesToRemove.length; i++) {
|
||||||
|
toc.removeChild(tocEntriesToRemove[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rebuild TOC entries.
|
||||||
|
var entries = tocEntries(document.getElementById("content"), toclevels);
|
||||||
|
for (var i = 0; i < entries.length; ++i) {
|
||||||
|
var entry = entries[i];
|
||||||
|
if (entry.element.id == "")
|
||||||
|
entry.element.id = "_toc_" + i;
|
||||||
|
var a = document.createElement("a");
|
||||||
|
a.href = "#" + entry.element.id;
|
||||||
|
a.appendChild(document.createTextNode(entry.text));
|
||||||
|
var div = document.createElement("div");
|
||||||
|
div.appendChild(a);
|
||||||
|
div.className = "toclevel" + entry.toclevel;
|
||||||
|
toc.appendChild(div);
|
||||||
|
}
|
||||||
|
if (entries.length == 0)
|
||||||
|
toc.parentNode.removeChild(toc);
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////
|
||||||
|
// Footnotes generator
|
||||||
|
/////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/* Based on footnote generation code from:
|
||||||
|
* http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
footnotes: function () {
|
||||||
|
// Delete existing footnote entries in case we're reloading the footnodes.
|
||||||
|
var i;
|
||||||
|
var noteholder = document.getElementById("footnotes");
|
||||||
|
if (!noteholder) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var entriesToRemove = [];
|
||||||
|
for (i = 0; i < noteholder.childNodes.length; i++) {
|
||||||
|
var entry = noteholder.childNodes[i];
|
||||||
|
if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
|
||||||
|
entriesToRemove.push(entry);
|
||||||
|
}
|
||||||
|
for (i = 0; i < entriesToRemove.length; i++) {
|
||||||
|
noteholder.removeChild(entriesToRemove[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rebuild footnote entries.
|
||||||
|
var cont = document.getElementById("content");
|
||||||
|
var spans = cont.getElementsByTagName("span");
|
||||||
|
var refs = {};
|
||||||
|
var n = 0;
|
||||||
|
for (i=0; i<spans.length; i++) {
|
||||||
|
if (spans[i].className == "footnote") {
|
||||||
|
n++;
|
||||||
|
var note = spans[i].getAttribute("data-note");
|
||||||
|
if (!note) {
|
||||||
|
// Use [\s\S] in place of . so multi-line matches work.
|
||||||
|
// Because JavaScript has no s (dotall) regex flag.
|
||||||
|
note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
|
||||||
|
spans[i].innerHTML =
|
||||||
|
"[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
|
||||||
|
"' title='View footnote' class='footnote'>" + n + "</a>]";
|
||||||
|
spans[i].setAttribute("data-note", note);
|
||||||
|
}
|
||||||
|
noteholder.innerHTML +=
|
||||||
|
"<div class='footnote' id='_footnote_" + n + "'>" +
|
||||||
|
"<a href='#_footnoteref_" + n + "' title='Return to text'>" +
|
||||||
|
n + "</a>. " + note + "</div>";
|
||||||
|
var id =spans[i].getAttribute("id");
|
||||||
|
if (id != null) refs["#"+id] = n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (n == 0)
|
||||||
|
noteholder.parentNode.removeChild(noteholder);
|
||||||
|
else {
|
||||||
|
// Process footnoterefs.
|
||||||
|
for (i=0; i<spans.length; i++) {
|
||||||
|
if (spans[i].className == "footnoteref") {
|
||||||
|
var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
|
||||||
|
href = href.match(/#.*/)[0]; // Because IE return full URL.
|
||||||
|
n = refs[href];
|
||||||
|
spans[i].innerHTML =
|
||||||
|
"[<a href='#_footnote_" + n +
|
||||||
|
"' title='View footnote' class='footnote'>" + n + "</a>]";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
install: function(toclevels) {
|
||||||
|
var timerId;
|
||||||
|
|
||||||
|
function reinstall() {
|
||||||
|
asciidoc.footnotes();
|
||||||
|
if (toclevels) {
|
||||||
|
asciidoc.toc(toclevels);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function reinstallAndRemoveTimer() {
|
||||||
|
clearInterval(timerId);
|
||||||
|
reinstall();
|
||||||
|
}
|
||||||
|
|
||||||
|
timerId = setInterval(reinstall, 500);
|
||||||
|
if (document.addEventListener)
|
||||||
|
document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
|
||||||
|
else
|
||||||
|
window.onload = reinstallAndRemoveTimer;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
asciidoc.install();
|
||||||
|
/*]]>*/
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body class="manpage">
|
||||||
|
<div id="header">
|
||||||
|
<h1>
|
||||||
|
git-cherry-pick-upload(1) Manual Page
|
||||||
|
</h1>
|
||||||
|
<h2>NAME</h2>
|
||||||
|
<div class="sectionbody">
|
||||||
|
<p>git-cherry-pick-upload -
|
||||||
|
Upload the diff between a revision and its parent to rietveld.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="content">
|
||||||
|
<div class="sect1">
|
||||||
|
<h2 id="_synopsis">SYNOPSIS</h2>
|
||||||
|
<div class="sectionbody">
|
||||||
|
<div class="verseblock">
|
||||||
|
<pre class="content"><em>git cherry-pick-upload --branch <remote_branch_name> <commit_hash></em></pre>
|
||||||
|
<div class="attribution">
|
||||||
|
</div></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="sect1">
|
||||||
|
<h2 id="_description">DESCRIPTION</h2>
|
||||||
|
<div class="sectionbody">
|
||||||
|
<div class="paragraph"><p><code>git cherry-pick-upload</code> is used to upload a cherry pick to rietveld. It uses
|
||||||
|
your view of the remote to generate the diff between a revision and its parent,
|
||||||
|
and then uploads that diff to rietveld.</p></div>
|
||||||
|
<div class="paragraph"><p>The commit message is annotated with "(cherry picked from commit [parent sha1])"
|
||||||
|
as if it were generated by <code>git cherry-pick -x</code>.</p></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="sect1">
|
||||||
|
<h2 id="_example">EXAMPLE</h2>
|
||||||
|
<div class="sectionbody">
|
||||||
|
<div class="paragraph"><p></p></div><div class="listingblock"><div class="content"><pre><code><span style="font-weight: bold; color: #ffffff">$ git cherry-pick-upload -h</span>
|
||||||
|
usage: git_cherry_pick_upload.py [-h] --branch <branch> <commit>
|
||||||
|
|
||||||
|
positional arguments:
|
||||||
|
<commit> SHA to cherry pick.
|
||||||
|
|
||||||
|
optional arguments:
|
||||||
|
-h, --help show this help message and exit
|
||||||
|
--branch <branch>, -b <branch>
|
||||||
|
The upstream branch to cherry pick to.
|
||||||
|
|
||||||
|
<span style="font-weight: bold; color: #ffffff">$ git cherry-pick-upload -b my_branch c02b7d24a066adb747fdeb12deb21bfa</span>
|
||||||
|
Found parent revision: b96d69fda53845a205151613a9c4cc93
|
||||||
|
Loaded authentication cookies from .codereview_upload_cookies
|
||||||
|
Issue created. URL: https://codereview.chromium.org/1234567890
|
||||||
|
Uploading base_file for some/path/first.file: OK
|
||||||
|
Uploading some/path/first.file: OK
|
||||||
|
Uploading base_file for some/path/second.file: OK
|
||||||
|
Uploading some/path/second.file: OK
|
||||||
|
Uploading base_file for some/path/third.file: OK
|
||||||
|
Uploading some/path/third.file: OK
|
||||||
|
Finalizing upload: OK
|
||||||
|
</code></pre></div></div><p><div class="paragraph"></p></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="sect1">
|
||||||
|
<h2 id="_see_also">SEE ALSO</h2>
|
||||||
|
<div class="sectionbody">
|
||||||
|
<div class="paragraph"><p><a href="git-cherry-pick.html">git-cherry-pick(1)</a>
|
||||||
|
<a href="git-cl-upload.html">git-cl-upload(1)</a></p></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="sect1">
|
||||||
|
<h2 id="_chromium_depot_tools">CHROMIUM DEPOT_TOOLS</h2>
|
||||||
|
<div class="sectionbody">
|
||||||
|
<div class="paragraph"><p>Part of the chromium <a href="depot_tools.html">depot_tools(7)</a> suite. These tools are meant to
|
||||||
|
assist with the development of chromium and related projects. Download the tools
|
||||||
|
from <a href="https://chromium.googlesource.com/chromium/tools/depot_tools.git">here</a>.</p></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="footnotes"><hr /></div>
|
||||||
|
<div id="footer">
|
||||||
|
<div id="footer-text">
|
||||||
|
Last updated 2014-07-23 14:38:36 PDT
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,89 @@
|
|||||||
|
'\" t
|
||||||
|
.\" Title: git-cherry-pick-upload
|
||||||
|
.\" Author: [FIXME: author] [see http://docbook.sf.net/el/author]
|
||||||
|
.\" Generator: DocBook XSL Stylesheets v1.76.1 <http://docbook.sf.net/>
|
||||||
|
.\" Date: 07/23/2014
|
||||||
|
.\" Manual: Chromium depot_tools Manual
|
||||||
|
.\" Source: depot_tools dff725e
|
||||||
|
.\" Language: English
|
||||||
|
.\"
|
||||||
|
.TH "GIT\-CHERRY-PICK-UPLOAD" "1" "07/23/2014" "depot_tools dff725e" "Chromium depot_tools Manual"
|
||||||
|
.\" -----------------------------------------------------------------
|
||||||
|
.\" * Define some portability stuff
|
||||||
|
.\" -----------------------------------------------------------------
|
||||||
|
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
.\" http://bugs.debian.org/507673
|
||||||
|
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
|
||||||
|
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
.ie \n(.g .ds Aq \(aq
|
||||||
|
.el .ds Aq '
|
||||||
|
.\" -----------------------------------------------------------------
|
||||||
|
.\" * set default formatting
|
||||||
|
.\" -----------------------------------------------------------------
|
||||||
|
.\" disable hyphenation
|
||||||
|
.nh
|
||||||
|
.\" disable justification (adjust text to left margin only)
|
||||||
|
.ad l
|
||||||
|
.\" -----------------------------------------------------------------
|
||||||
|
.\" * MAIN CONTENT STARTS HERE *
|
||||||
|
.\" -----------------------------------------------------------------
|
||||||
|
.SH "NAME"
|
||||||
|
git-cherry-pick-upload \- Upload the diff between a revision and its parent to rietveld\&.
|
||||||
|
.SH "SYNOPSIS"
|
||||||
|
.sp
|
||||||
|
.nf
|
||||||
|
\fIgit cherry-pick-upload\fR \-\-branch <remote_branch_name> <commit_hash>
|
||||||
|
.fi
|
||||||
|
.sp
|
||||||
|
.SH "DESCRIPTION"
|
||||||
|
.sp
|
||||||
|
git cherry-pick-upload is used to upload a cherry pick to rietveld\&. It uses your view of the remote to generate the diff between a revision and its parent, and then uploads that diff to rietveld\&.
|
||||||
|
.sp
|
||||||
|
The commit message is annotated with "(cherry picked from commit [parent sha1])" as if it were generated by git cherry\-pick \-x\&.
|
||||||
|
.SH "EXAMPLE"
|
||||||
|
.sp
|
||||||
|
|
||||||
|
.sp
|
||||||
|
.if n \{\
|
||||||
|
.RS 4
|
||||||
|
.\}
|
||||||
|
.nf
|
||||||
|
\fB$ git cherry-pick-upload \-h\fR
|
||||||
|
usage: git_cherry_pick_upload\&.py [\-h] \-\-branch <branch> <commit>
|
||||||
|
|
||||||
|
positional arguments:
|
||||||
|
<commit> SHA to cherry pick\&.
|
||||||
|
|
||||||
|
optional arguments:
|
||||||
|
\-h, \-\-help show this help message and exit
|
||||||
|
\-\-branch <branch>, \-b <branch>
|
||||||
|
The upstream branch to cherry pick to\&.
|
||||||
|
|
||||||
|
\fB$ git cherry-pick-upload \-b my_branch c02b7d24a066adb747fdeb12deb21bfa\fR
|
||||||
|
Found parent revision: b96d69fda53845a205151613a9c4cc93
|
||||||
|
Loaded authentication cookies from \&.codereview_upload_cookies
|
||||||
|
Issue created\&. URL: https://codereview\&.chromium\&.org/1234567890
|
||||||
|
Uploading base_file for some/path/first\&.file: OK
|
||||||
|
Uploading some/path/first\&.file: OK
|
||||||
|
Uploading base_file for some/path/second\&.file: OK
|
||||||
|
Uploading some/path/second\&.file: OK
|
||||||
|
Uploading base_file for some/path/third\&.file: OK
|
||||||
|
Uploading some/path/third\&.file: OK
|
||||||
|
Finalizing upload: OK
|
||||||
|
.fi
|
||||||
|
.if n \{\
|
||||||
|
.RE
|
||||||
|
.\}
|
||||||
|
.sp
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
.sp
|
||||||
|
\fBgit-cherry-pick\fR(1) \fBgit-cl-upload\fR(1)
|
||||||
|
.SH "CHROMIUM DEPOT_TOOLS"
|
||||||
|
.sp
|
||||||
|
Part of the chromium \fBdepot_tools\fR(7) suite\&. These tools are meant to assist with the development of chromium and related projects\&. Download the tools from \m[blue]\fBhere\fR\m[]\&\s-2\u[1]\d\s+2\&.
|
||||||
|
.SH "NOTES"
|
||||||
|
.IP " 1." 4
|
||||||
|
here
|
||||||
|
.RS 4
|
||||||
|
\%https://chromium.googlesource.com/chromium/tools/depot_tools.git
|
||||||
|
.RE
|
@ -0,0 +1 @@
|
|||||||
|
Upload the diff between a revision and its parent to rietveld.
|
@ -0,0 +1,17 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
. demo_repo.sh
|
||||||
|
|
||||||
|
run git cherry-pick-upload -h
|
||||||
|
echo
|
||||||
|
|
||||||
|
pcommand git cherry-pick-upload -b my_branch c02b7d24a066adb747fdeb12deb21bfa
|
||||||
|
echo 'Found parent revision: b96d69fda53845a205151613a9c4cc93'
|
||||||
|
echo 'Loaded authentication cookies from .codereview_upload_cookies'
|
||||||
|
echo 'Issue created. URL: https://codereview.chromium.org/1234567890'
|
||||||
|
echo ' Uploading base_file for some/path/first.file: OK'
|
||||||
|
echo ' Uploading some/path/first.file: OK'
|
||||||
|
echo ' Uploading base_file for some/path/second.file: OK'
|
||||||
|
echo ' Uploading some/path/second.file: OK'
|
||||||
|
echo ' Uploading base_file for some/path/third.file: OK'
|
||||||
|
echo ' Uploading some/path/third.file: OK'
|
||||||
|
echo 'Finalizing upload: OK'
|
@ -0,0 +1,35 @@
|
|||||||
|
git-cherry-pick-upload(1)
|
||||||
|
=============
|
||||||
|
|
||||||
|
NAME
|
||||||
|
----
|
||||||
|
git-cherry-pick-upload -
|
||||||
|
include::_git-cherry-pick-upload_desc.helper.txt[]
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
--------
|
||||||
|
[verse]
|
||||||
|
'git cherry-pick-upload' --branch <remote_branch_name> <commit_hash>
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
-----------
|
||||||
|
|
||||||
|
`git cherry-pick-upload` is used to upload a cherry pick to rietveld. It uses
|
||||||
|
your view of the remote to generate the diff between a revision and its parent,
|
||||||
|
and then uploads that diff to rietveld.
|
||||||
|
|
||||||
|
The commit message is annotated with "(cherry picked from commit [parent sha1])"
|
||||||
|
as if it were generated by `git cherry-pick -x`.
|
||||||
|
|
||||||
|
EXAMPLE
|
||||||
|
-------
|
||||||
|
demo:1[]
|
||||||
|
|
||||||
|
SEE ALSO
|
||||||
|
--------
|
||||||
|
linkgit:git-cherry-pick[1]
|
||||||
|
linkgit:git-cl-upload[1]
|
||||||
|
|
||||||
|
include::_footer.txt[]
|
||||||
|
|
||||||
|
// vim: ft=asciidoc:
|
Loading…
Reference in New Issue