Merge branch 'maint' to sync with GIT 1.6.0.6
Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
						commit
						efe05b019c
					
				|  | @ -0,0 +1,10 @@ | ||||||
|  | GIT v1.5.4.7 Release Notes | ||||||
|  | ========================== | ||||||
|  |  | ||||||
|  | Fixes since 1.5.4.7 | ||||||
|  | ------------------- | ||||||
|  |  | ||||||
|  |  * Removed support for an obsolete gitweb request URI, whose | ||||||
|  |    implementation ran "git diff" Porcelain, instead of using plumbing, | ||||||
|  |    which would have run an external diff command specified in the | ||||||
|  |    repository configuration as the gitweb user. | ||||||
|  | @ -0,0 +1,10 @@ | ||||||
|  | GIT v1.5.5.6 Release Notes | ||||||
|  | ========================== | ||||||
|  |  | ||||||
|  | Fixes since 1.5.5.5 | ||||||
|  | ------------------- | ||||||
|  |  | ||||||
|  |  * Removed support for an obsolete gitweb request URI, whose | ||||||
|  |    implementation ran "git diff" Porcelain, instead of using plumbing, | ||||||
|  |    which would have run an external diff command specified in the | ||||||
|  |    repository configuration as the gitweb user. | ||||||
|  | @ -0,0 +1,10 @@ | ||||||
|  | GIT v1.5.6.6 Release Notes | ||||||
|  | ========================== | ||||||
|  |  | ||||||
|  | Fixes since 1.5.6.5 | ||||||
|  | ------------------- | ||||||
|  |  | ||||||
|  |  * Removed support for an obsolete gitweb request URI, whose | ||||||
|  |    implementation ran "git diff" Porcelain, instead of using plumbing, | ||||||
|  |    which would have run an external diff command specified in the | ||||||
|  |    repository configuration as the gitweb user. | ||||||
|  | @ -0,0 +1,33 @@ | ||||||
|  | GIT v1.6.0.6 Release Notes | ||||||
|  | ========================== | ||||||
|  |  | ||||||
|  | Fixes since 1.6.0.5 | ||||||
|  | ------------------- | ||||||
|  |  | ||||||
|  |  * "git fsck" had a deep recursion that wasted stack space. | ||||||
|  |  | ||||||
|  |  * "git fast-export" and "git fast-import" choked on an old style | ||||||
|  |    annotated tag that lack the tagger information. | ||||||
|  |  | ||||||
|  |  * "git mergetool -- file" did not correctly skip "--" marker that | ||||||
|  |    signals the end of options list. | ||||||
|  |  | ||||||
|  |  * "git show $tag" segfaulted when an annotated $tag pointed at a | ||||||
|  |    nonexistent object. | ||||||
|  |  | ||||||
|  |  * "git show 2>error" when the standard output is automatically redirected | ||||||
|  |    to the pager redirected the standard error to the pager as well; there | ||||||
|  |    was no need to. | ||||||
|  |  | ||||||
|  |  * "git send-email" did not correctly handle list of addresses when | ||||||
|  |    they had quoted comma (e.g. "Lastname, Givenname" <mail@addre.ss>). | ||||||
|  |  | ||||||
|  |  * Logic to discover branch ancestry in "git svn" was unreliable when | ||||||
|  |    the process to fetch history was interrupted. | ||||||
|  |  | ||||||
|  |  * Removed support for an obsolete gitweb request URI, whose | ||||||
|  |    implementation ran "git diff" Porcelain, instead of using plumbing, | ||||||
|  |    which would have run an external diff command specified in the | ||||||
|  |    repository configuration as the gitweb user. | ||||||
|  |  | ||||||
|  | Also contains numerous documentation typofixes. | ||||||
|  | @ -222,6 +222,9 @@ D-C-O.  Indeed you are encouraged to do so.  Do not forget to | ||||||
| place an in-body "From: " line at the beginning to properly attribute | place an in-body "From: " line at the beginning to properly attribute | ||||||
| the change to its true author (see (2) above). | the change to its true author (see (2) above). | ||||||
|  |  | ||||||
|  | Also notice that a real name is used in the Signed-off-by: line. Please | ||||||
|  | don't hide your real name. | ||||||
|  |  | ||||||
| Some people also put extra tags at the end. | Some people also put extra tags at the end. | ||||||
|  |  | ||||||
| "Acked-by:" says that the patch was reviewed by the person who | "Acked-by:" says that the patch was reviewed by the person who | ||||||
|  |  | ||||||
|  | @ -58,7 +58,7 @@ Possible status letters are: | ||||||
| be committed) | be committed) | ||||||
| - X: "unknown" change type (most probably a bug, please report it) | - X: "unknown" change type (most probably a bug, please report it) | ||||||
|  |  | ||||||
| Status letters C and M are always followed by a score (denoting the | Status letters C and R are always followed by a score (denoting the | ||||||
| percentage of similarity between the source and target of the move or | percentage of similarity between the source and target of the move or | ||||||
| copy), and are the only ones to be so. | copy), and are the only ones to be so. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -143,15 +143,15 @@ different from it. | ||||||
|  |  | ||||||
| A `-` character in the column N means that the line appears in | A `-` character in the column N means that the line appears in | ||||||
| fileN but it does not appear in the result.  A `+` character | fileN but it does not appear in the result.  A `+` character | ||||||
| in the column N means that the line appears in the last file, | in the column N means that the line appears in the result, | ||||||
| and fileN does not have that line (in other words, the line was | and fileN does not have that line (in other words, the line was | ||||||
| added, from the point of view of that parent). | added, from the point of view of that parent). | ||||||
|  |  | ||||||
| In the above example output, the function signature was changed | In the above example output, the function signature was changed | ||||||
| from both files (hence two `-` removals from both file1 and | from both files (hence two `-` removals from both file1 and | ||||||
| file2, plus `++` to mean one line that was added does not appear | file2, plus `++` to mean one line that was added does not appear | ||||||
| in either file1 nor file2).  Also two other lines are the same | in either file1 nor file2).  Also eight other lines are the same | ||||||
| from file1 but do not appear in file2 (hence prefixed with ` +`). | from file1 but do not appear in file2 (hence prefixed with `{plus}`). | ||||||
|  |  | ||||||
| When shown by `git diff-tree -c`, it compares the parents of a | When shown by `git diff-tree -c`, it compares the parents of a | ||||||
| merge commit with the merge result (i.e. file1..fileN are the | merge commit with the merge result (i.e. file1..fileN are the | ||||||
|  |  | ||||||
|  | @ -166,7 +166,7 @@ FROM UPSTREAM REBASE" section in linkgit:git-rebase[1].) | ||||||
| 	'git-commit' if any paths are given on the command line, | 	'git-commit' if any paths are given on the command line, | ||||||
| 	in which case this option can be omitted. | 	in which case this option can be omitted. | ||||||
| 	If this option is specified together with '--amend', then | 	If this option is specified together with '--amend', then | ||||||
| 	no paths need be specified, which can be used to amend | 	no paths need to be specified, which can be used to amend | ||||||
| 	the last commit without committing changes that have | 	the last commit without committing changes that have | ||||||
| 	already been staged. | 	already been staged. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -43,7 +43,7 @@ include::diff-options.txt[] | ||||||
| 	show tree entry itself as well as subtrees.  Implies -r. | 	show tree entry itself as well as subtrees.  Implies -r. | ||||||
|  |  | ||||||
| --root:: | --root:: | ||||||
| 	When '--root' is specified the initial commit will be showed as a big | 	When '--root' is specified the initial commit will be shown as a big | ||||||
| 	creation event. This is equivalent to a diff against the NULL tree. | 	creation event. This is equivalent to a diff against the NULL tree. | ||||||
|  |  | ||||||
| --stdin:: | --stdin:: | ||||||
|  |  | ||||||
|  | @ -65,6 +65,12 @@ If the backend uses a similar \--import-marks file, this allows for | ||||||
| incremental bidirectional exporting of the repository by keeping the | incremental bidirectional exporting of the repository by keeping the | ||||||
| marks the same across runs. | marks the same across runs. | ||||||
|  |  | ||||||
|  | --fake-missing-tagger:: | ||||||
|  | 	Some old repositories have tags without a tagger.  The | ||||||
|  | 	fast-import protocol was pretty strict about that, and did not | ||||||
|  | 	allow that.  So fake a tagger to be able to fast-import the | ||||||
|  | 	output. | ||||||
|  |  | ||||||
|  |  | ||||||
| EXAMPLES | EXAMPLES | ||||||
| -------- | -------- | ||||||
|  |  | ||||||
|  | @ -13,7 +13,7 @@ SYNOPSIS | ||||||
|  |  | ||||||
| DESCRIPTION | DESCRIPTION | ||||||
| ----------- | ----------- | ||||||
| Reading a single e-mail message from the standard input, and | Reads a single e-mail message from the standard input, and | ||||||
| writes the commit log message in <msg> file, and the patches in | writes the commit log message in <msg> file, and the patches in | ||||||
| <patch> file.  The author name, e-mail and e-mail subject are | <patch> file.  The author name, e-mail and e-mail subject are | ||||||
| written out to the standard output to be used by 'git-am' | written out to the standard output to be used by 'git-am' | ||||||
|  |  | ||||||
|  | @ -86,7 +86,7 @@ post-receive Hook | ||||||
| ----------------- | ----------------- | ||||||
| After all refs were updated (or attempted to be updated), if any | After all refs were updated (or attempted to be updated), if any | ||||||
| ref update was successful, and if $GIT_DIR/hooks/post-receive | ref update was successful, and if $GIT_DIR/hooks/post-receive | ||||||
| file exists and is executable, it will be invoke once with no | file exists and is executable, it will be invoked once with no | ||||||
| parameters.  The standard input of the hook will be one line | parameters.  The standard input of the hook will be one line | ||||||
| for each successfully updated ref: | for each successfully updated ref: | ||||||
|  |  | ||||||
|  | @ -133,7 +133,7 @@ post-update Hook | ||||||
| ---------------- | ---------------- | ||||||
| After all other processing, if at least one ref was updated, and | After all other processing, if at least one ref was updated, and | ||||||
| if $GIT_DIR/hooks/post-update file exists and is executable, then | if $GIT_DIR/hooks/post-update file exists and is executable, then | ||||||
| post-update will called with the list of refs that have been updated. | post-update will be called with the list of refs that have been updated. | ||||||
| This can be used to implement any repository wide cleanup tasks. | This can be used to implement any repository wide cleanup tasks. | ||||||
|  |  | ||||||
| The exit code from this hook invocation is ignored; the only thing | The exit code from this hook invocation is ignored; the only thing | ||||||
|  |  | ||||||
|  | @ -28,7 +28,7 @@ updated.  This command is to manage the information recorded in it. | ||||||
|  |  | ||||||
| The subcommand "expire" is used to prune older reflog entries. | The subcommand "expire" is used to prune older reflog entries. | ||||||
| Entries older than `expire` time, or entries older than | Entries older than `expire` time, or entries older than | ||||||
| `expire-unreachable` time and are not reachable from the current | `expire-unreachable` time and not reachable from the current | ||||||
| tip, are removed from the reflog.  This is typically not used | tip, are removed from the reflog.  This is typically not used | ||||||
| directly by the end users -- instead, see linkgit:git-gc[1]. | directly by the end users -- instead, see linkgit:git-gc[1]. | ||||||
|  |  | ||||||
|  | @ -71,7 +71,7 @@ them. | ||||||
| 	which in turn defaults to 90 days. | 	which in turn defaults to 90 days. | ||||||
|  |  | ||||||
| --expire-unreachable=<time>:: | --expire-unreachable=<time>:: | ||||||
| 	Entries older than this time and are not reachable from | 	Entries older than this time and not reachable from | ||||||
| 	the current tip of the branch are pruned.  Without the | 	the current tip of the branch are pruned.  Without the | ||||||
| 	option it is taken from configuration | 	option it is taken from configuration | ||||||
| 	`gc.reflogExpireUnreachable`, which in turn defaults to | 	`gc.reflogExpireUnreachable`, which in turn defaults to | ||||||
|  |  | ||||||
|  | @ -30,7 +30,7 @@ OPTIONS | ||||||
| ------- | ------- | ||||||
| <rev>:: | <rev>:: | ||||||
| 	Arbitrary extended SHA1 expression (see linkgit:git-rev-parse[1]) | 	Arbitrary extended SHA1 expression (see linkgit:git-rev-parse[1]) | ||||||
| 	that typically names a branch HEAD or a tag. | 	that typically names a branch head or a tag. | ||||||
|  |  | ||||||
| <glob>:: | <glob>:: | ||||||
| 	A glob pattern that matches branch or tag names under | 	A glob pattern that matches branch or tag names under | ||||||
|  |  | ||||||
|  | @ -87,7 +87,7 @@ use by subsequent users cloning the superproject. If the URL is | ||||||
| given relative to the superproject's repository, the presumption | given relative to the superproject's repository, the presumption | ||||||
| is the superproject and submodule repositories will be kept | is the superproject and submodule repositories will be kept | ||||||
| together in the same relative location, and only the | together in the same relative location, and only the | ||||||
| superproject's URL need be provided: git-submodule will correctly | superproject's URL needs to be provided: git-submodule will correctly | ||||||
| locate the submodule using the relative URL in .gitmodules. | locate the submodule using the relative URL in .gitmodules. | ||||||
|  |  | ||||||
| status:: | status:: | ||||||
|  |  | ||||||
|  | @ -55,7 +55,7 @@ OPTIONS | ||||||
|         default behavior is to error out.  This option makes |         default behavior is to error out.  This option makes | ||||||
| 	'git-update-index' continue anyway. | 	'git-update-index' continue anyway. | ||||||
|  |  | ||||||
| --ignore-submodules: | --ignore-submodules:: | ||||||
| 	Do not try to update submodules.  This option is only respected | 	Do not try to update submodules.  This option is only respected | ||||||
| 	when passed before --refresh. | 	when passed before --refresh. | ||||||
|  |  | ||||||
|  | @ -78,9 +78,9 @@ OPTIONS | ||||||
|  |  | ||||||
| --assume-unchanged:: | --assume-unchanged:: | ||||||
| --no-assume-unchanged:: | --no-assume-unchanged:: | ||||||
| 	When these flags are specified, the object name recorded | 	When these flags are specified, the object names recorded | ||||||
| 	for the paths are not updated.  Instead, these options | 	for the paths are not updated.  Instead, these options | ||||||
| 	sets and unsets the "assume unchanged" bit for the | 	set and unset the "assume unchanged" bit for the | ||||||
| 	paths.  When the "assume unchanged" bit is on, git stops | 	paths.  When the "assume unchanged" bit is on, git stops | ||||||
| 	checking the working tree files for possible | 	checking the working tree files for possible | ||||||
| 	modifications, so you need to manually unset the bit to | 	modifications, so you need to manually unset the bit to | ||||||
|  | @ -122,7 +122,7 @@ you will need to handle the situation manually. | ||||||
| 	'git-update-index' refuses an attempt to add `path/file`. | 	'git-update-index' refuses an attempt to add `path/file`. | ||||||
| 	Similarly if a file `path/file` exists, a file `path` | 	Similarly if a file `path/file` exists, a file `path` | ||||||
| 	cannot be added.  With --replace flag, existing entries | 	cannot be added.  With --replace flag, existing entries | ||||||
| 	that conflicts with the entry being added are | 	that conflict with the entry being added are | ||||||
| 	automatically removed with warning messages. | 	automatically removed with warning messages. | ||||||
|  |  | ||||||
| --stdin:: | --stdin:: | ||||||
|  |  | ||||||
|  | @ -43,9 +43,10 @@ unreleased) version of git, that is available from 'master' | ||||||
| branch of the `git.git` repository. | branch of the `git.git` repository. | ||||||
| Documentation for older releases are available here: | Documentation for older releases are available here: | ||||||
|  |  | ||||||
| * link:v1.6.0.5/git.html[documentation for release 1.6.0.5] | * link:v1.6.0.6/git.html[documentation for release 1.6.0.6] | ||||||
|  |  | ||||||
| * release notes for | * release notes for | ||||||
|  |   link:RelNotes-1.6.0.6.txt[1.6.0.6], | ||||||
|   link:RelNotes-1.6.0.5.txt[1.6.0.5], |   link:RelNotes-1.6.0.5.txt[1.6.0.5], | ||||||
|   link:RelNotes-1.6.0.4.txt[1.6.0.4], |   link:RelNotes-1.6.0.4.txt[1.6.0.4], | ||||||
|   link:RelNotes-1.6.0.3.txt[1.6.0.3], |   link:RelNotes-1.6.0.3.txt[1.6.0.3], | ||||||
|  | @ -53,9 +54,10 @@ Documentation for older releases are available here: | ||||||
|   link:RelNotes-1.6.0.1.txt[1.6.0.1], |   link:RelNotes-1.6.0.1.txt[1.6.0.1], | ||||||
|   link:RelNotes-1.6.0.txt[1.6.0]. |   link:RelNotes-1.6.0.txt[1.6.0]. | ||||||
|  |  | ||||||
| * link:v1.5.6.5/git.html[documentation for release 1.5.6.5] | * link:v1.5.6.6/git.html[documentation for release 1.5.6.6] | ||||||
|  |  | ||||||
| * release notes for | * release notes for | ||||||
|  |   link:RelNotes-1.5.6.6.txt[1.5.6.6], | ||||||
|   link:RelNotes-1.5.6.5.txt[1.5.6.5], |   link:RelNotes-1.5.6.5.txt[1.5.6.5], | ||||||
|   link:RelNotes-1.5.6.4.txt[1.5.6.4], |   link:RelNotes-1.5.6.4.txt[1.5.6.4], | ||||||
|   link:RelNotes-1.5.6.3.txt[1.5.6.3], |   link:RelNotes-1.5.6.3.txt[1.5.6.3], | ||||||
|  | @ -63,18 +65,22 @@ Documentation for older releases are available here: | ||||||
|   link:RelNotes-1.5.6.1.txt[1.5.6.1], |   link:RelNotes-1.5.6.1.txt[1.5.6.1], | ||||||
|   link:RelNotes-1.5.6.txt[1.5.6]. |   link:RelNotes-1.5.6.txt[1.5.6]. | ||||||
|  |  | ||||||
| * link:v1.5.5.4/git.html[documentation for release 1.5.5.4] | * link:v1.5.5.6/git.html[documentation for release 1.5.5.6] | ||||||
|  |  | ||||||
| * release notes for | * release notes for | ||||||
|  |   link:RelNotes-1.5.5.6.txt[1.5.5.6], | ||||||
|  |   link:RelNotes-1.5.5.5.txt[1.5.5.5], | ||||||
|   link:RelNotes-1.5.5.4.txt[1.5.5.4], |   link:RelNotes-1.5.5.4.txt[1.5.5.4], | ||||||
|   link:RelNotes-1.5.5.3.txt[1.5.5.3], |   link:RelNotes-1.5.5.3.txt[1.5.5.3], | ||||||
|   link:RelNotes-1.5.5.2.txt[1.5.5.2], |   link:RelNotes-1.5.5.2.txt[1.5.5.2], | ||||||
|   link:RelNotes-1.5.5.1.txt[1.5.5.1], |   link:RelNotes-1.5.5.1.txt[1.5.5.1], | ||||||
|   link:RelNotes-1.5.5.txt[1.5.5]. |   link:RelNotes-1.5.5.txt[1.5.5]. | ||||||
|  |  | ||||||
| * link:v1.5.4.5/git.html[documentation for release 1.5.4.5] | * link:v1.5.4.7/git.html[documentation for release 1.5.4.7] | ||||||
|  |  | ||||||
| * release notes for | * release notes for | ||||||
|  |   link:RelNotes-1.5.4.7.txt[1.5.4.7], | ||||||
|  |   link:RelNotes-1.5.4.6.txt[1.5.4.6], | ||||||
|   link:RelNotes-1.5.4.5.txt[1.5.4.5], |   link:RelNotes-1.5.4.5.txt[1.5.4.5], | ||||||
|   link:RelNotes-1.5.4.4.txt[1.5.4.4], |   link:RelNotes-1.5.4.4.txt[1.5.4.4], | ||||||
|   link:RelNotes-1.5.4.3.txt[1.5.4.3], |   link:RelNotes-1.5.4.3.txt[1.5.4.3], | ||||||
|  |  | ||||||
|  | @ -999,8 +999,8 @@ Fast forward (no commit created; -m option ignored) | ||||||
|  2 files changed, 2 insertions(+), 0 deletions(-) |  2 files changed, 2 insertions(+), 0 deletions(-) | ||||||
| ---------------- | ---------------- | ||||||
|  |  | ||||||
| Because your branch did not contain anything more than what are | Because your branch did not contain anything more than what had | ||||||
| already merged into the `master` branch, the merge operation did | already been merged into the `master` branch, the merge operation did | ||||||
| not actually do a merge. Instead, it just updated the top of | not actually do a merge. Instead, it just updated the top of | ||||||
| the tree of your branch to that of the `master` branch. This is | the tree of your branch to that of the `master` branch. This is | ||||||
| often called 'fast forward' merge. | often called 'fast forward' merge. | ||||||
|  | @ -1352,7 +1352,7 @@ $ GIT_DIR=my-git.git git init | ||||||
| ------------ | ------------ | ||||||
|  |  | ||||||
| Make sure this directory is available for others you want your | Make sure this directory is available for others you want your | ||||||
| changes to be pulled by via the transport of your choice. Also | changes to be pulled via the transport of your choice. Also | ||||||
| you need to make sure that you have the 'git-receive-pack' | you need to make sure that you have the 'git-receive-pack' | ||||||
| program on the `$PATH`. | program on the `$PATH`. | ||||||
|  |  | ||||||
|  | @ -1511,7 +1511,7 @@ You can repack this private repository whenever you feel like. | ||||||
| 6. Push your changes to the public repository, and announce it | 6. Push your changes to the public repository, and announce it | ||||||
|    to the public. |    to the public. | ||||||
|  |  | ||||||
| 7. Every once in a while, "git-repack" the public repository. | 7. Every once in a while, 'git-repack' the public repository. | ||||||
|    Go back to step 5. and continue working. |    Go back to step 5. and continue working. | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -21,7 +21,7 @@ git repository. | ||||||
|  |  | ||||||
| OPTIONS | OPTIONS | ||||||
| ------- | ------- | ||||||
| To control which revisions to shown, the command takes options applicable to | To control which revisions to show, the command takes options applicable to | ||||||
| the 'git-rev-list' command (see linkgit:git-rev-list[1]). | the 'git-rev-list' command (see linkgit:git-rev-list[1]). | ||||||
| This manual page describes only the most | This manual page describes only the most | ||||||
| frequently used options. | frequently used options. | ||||||
|  | @ -80,7 +80,7 @@ Examples | ||||||
| -------- | -------- | ||||||
| gitk v2.6.12.. include/scsi drivers/scsi:: | gitk v2.6.12.. include/scsi drivers/scsi:: | ||||||
|  |  | ||||||
| 	Show as the changes since version 'v2.6.12' that changed any | 	Show the changes since version 'v2.6.12' that changed any | ||||||
| 	file in the include/scsi or drivers/scsi subdirectories | 	file in the include/scsi or drivers/scsi subdirectories | ||||||
|  |  | ||||||
| gitk --since="2 weeks ago" \-- gitk:: | gitk --since="2 weeks ago" \-- gitk:: | ||||||
|  |  | ||||||
|  | @ -7,11 +7,11 @@ At the core level, git is character encoding agnostic. | ||||||
|    to be what lstat(2) and creat(2) accepts.  There is no such |    to be what lstat(2) and creat(2) accepts.  There is no such | ||||||
|    thing as pathname encoding translation. |    thing as pathname encoding translation. | ||||||
|  |  | ||||||
|  - The contents of the blob objects are uninterpreted sequence |  - The contents of the blob objects are uninterpreted sequences | ||||||
|    of bytes.  There is no encoding translation at the core |    of bytes.  There is no encoding translation at the core | ||||||
|    level. |    level. | ||||||
|  |  | ||||||
|  - The commit log messages are uninterpreted sequence of non-NUL |  - The commit log messages are uninterpreted sequences of non-NUL | ||||||
|    bytes. |    bytes. | ||||||
|  |  | ||||||
| Although we encourage that the commit log messages are encoded | Although we encourage that the commit log messages are encoded | ||||||
|  |  | ||||||
|  | @ -24,6 +24,7 @@ static const char *fast_export_usage[] = { | ||||||
|  |  | ||||||
| static int progress; | static int progress; | ||||||
| static enum { VERBATIM, WARN, STRIP, ABORT } signed_tag_mode = ABORT; | static enum { VERBATIM, WARN, STRIP, ABORT } signed_tag_mode = ABORT; | ||||||
|  | static int fake_missing_tagger; | ||||||
|  |  | ||||||
| static int parse_opt_signed_tag_mode(const struct option *opt, | static int parse_opt_signed_tag_mode(const struct option *opt, | ||||||
| 				     const char *arg, int unset) | 				     const char *arg, int unset) | ||||||
|  | @ -297,10 +298,17 @@ static void handle_tag(const char *name, struct tag *tag) | ||||||
| 		message_size = strlen(message); | 		message_size = strlen(message); | ||||||
| 	} | 	} | ||||||
| 	tagger = memmem(buf, message ? message - buf : size, "\ntagger ", 8); | 	tagger = memmem(buf, message ? message - buf : size, "\ntagger ", 8); | ||||||
| 	if (!tagger) | 	if (!tagger) { | ||||||
| 		die ("No tagger for tag %s", sha1_to_hex(tag->object.sha1)); | 		if (fake_missing_tagger) | ||||||
|  | 			tagger = "tagger Unspecified Tagger " | ||||||
|  | 				"<unspecified-tagger> 0 +0000"; | ||||||
|  | 		else | ||||||
|  | 			tagger = ""; | ||||||
|  | 		tagger_end = tagger + strlen(tagger); | ||||||
|  | 	} else { | ||||||
| 		tagger++; | 		tagger++; | ||||||
| 		tagger_end = strchrnul(tagger, '\n'); | 		tagger_end = strchrnul(tagger, '\n'); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	/* handle signed tags */ | 	/* handle signed tags */ | ||||||
| 	if (message) { | 	if (message) { | ||||||
|  | @ -326,9 +334,10 @@ static void handle_tag(const char *name, struct tag *tag) | ||||||
|  |  | ||||||
| 	if (!prefixcmp(name, "refs/tags/")) | 	if (!prefixcmp(name, "refs/tags/")) | ||||||
| 		name += 10; | 		name += 10; | ||||||
| 	printf("tag %s\nfrom :%d\n%.*s\ndata %d\n%.*s\n", | 	printf("tag %s\nfrom :%d\n%.*s%sdata %d\n%.*s\n", | ||||||
| 	       name, get_object_mark(tag->tagged), | 	       name, get_object_mark(tag->tagged), | ||||||
| 	       (int)(tagger_end - tagger), tagger, | 	       (int)(tagger_end - tagger), tagger, | ||||||
|  | 	       tagger == tagger_end ? "" : "\n", | ||||||
| 	       (int)message_size, (int)message_size, message ? message : ""); | 	       (int)message_size, (int)message_size, message ? message : ""); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -483,6 +492,8 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix) | ||||||
| 			     "Dump marks to this file"), | 			     "Dump marks to this file"), | ||||||
| 		OPT_STRING(0, "import-marks", &import_filename, "FILE", | 		OPT_STRING(0, "import-marks", &import_filename, "FILE", | ||||||
| 			     "Import marks from this file"), | 			     "Import marks from this file"), | ||||||
|  | 		OPT_BOOLEAN(0, "fake-missing-tagger", &fake_missing_tagger, | ||||||
|  | 			     "Fake a tagger when tags lack one"), | ||||||
| 		OPT_END() | 		OPT_END() | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -43,7 +43,7 @@ Format of STDIN stream: | ||||||
|  |  | ||||||
|   new_tag ::= 'tag' sp tag_str lf |   new_tag ::= 'tag' sp tag_str lf | ||||||
|     'from' sp (ref_str | hexsha1 | sha1exp_str | idnum) lf |     'from' sp (ref_str | hexsha1 | sha1exp_str | idnum) lf | ||||||
|     'tagger' sp name '<' email '>' when lf |     ('tagger' sp name '<' email '>' when lf)? | ||||||
|     tag_msg; |     tag_msg; | ||||||
|   tag_msg ::= data; |   tag_msg ::= data; | ||||||
|  |  | ||||||
|  | @ -2265,23 +2265,27 @@ static void parse_new_tag(void) | ||||||
| 	read_next_command(); | 	read_next_command(); | ||||||
|  |  | ||||||
| 	/* tagger ... */ | 	/* tagger ... */ | ||||||
| 	if (prefixcmp(command_buf.buf, "tagger ")) | 	if (!prefixcmp(command_buf.buf, "tagger ")) { | ||||||
| 		die("Expected tagger command, got %s", command_buf.buf); |  | ||||||
| 		tagger = parse_ident(command_buf.buf + 7); | 		tagger = parse_ident(command_buf.buf + 7); | ||||||
|  | 		read_next_command(); | ||||||
|  | 	} else | ||||||
|  | 		tagger = NULL; | ||||||
|  |  | ||||||
| 	/* tag payload/message */ | 	/* tag payload/message */ | ||||||
| 	read_next_command(); |  | ||||||
| 	parse_data(&msg); | 	parse_data(&msg); | ||||||
|  |  | ||||||
| 	/* build the tag object */ | 	/* build the tag object */ | ||||||
| 	strbuf_reset(&new_data); | 	strbuf_reset(&new_data); | ||||||
|  |  | ||||||
| 	strbuf_addf(&new_data, | 	strbuf_addf(&new_data, | ||||||
| 		    "object %s\n" | 		    "object %s\n" | ||||||
| 		    "type %s\n" | 		    "type %s\n" | ||||||
| 		"tag %s\n" | 		    "tag %s\n", | ||||||
| 		"tagger %s\n" | 		    sha1_to_hex(sha1), commit_type, t->name); | ||||||
| 		"\n", | 	if (tagger) | ||||||
| 		sha1_to_hex(sha1), commit_type, t->name, tagger); | 		strbuf_addf(&new_data, | ||||||
|  | 			    "tagger %s\n", tagger); | ||||||
|  | 	strbuf_addch(&new_data, '\n'); | ||||||
| 	strbuf_addbuf(&new_data, &msg); | 	strbuf_addbuf(&new_data, &msg); | ||||||
| 	free(tagger); | 	free(tagger); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -296,6 +296,7 @@ do | ||||||
| 	    esac | 	    esac | ||||||
| 	    ;; | 	    ;; | ||||||
| 	--) | 	--) | ||||||
|  | 	    shift | ||||||
| 	    break | 	    break | ||||||
| 	    ;; | 	    ;; | ||||||
| 	-*) | 	-*) | ||||||
|  |  | ||||||
|  | @ -20,6 +20,7 @@ use strict; | ||||||
| use warnings; | use warnings; | ||||||
| use Term::ReadLine; | use Term::ReadLine; | ||||||
| use Getopt::Long; | use Getopt::Long; | ||||||
|  | use Text::ParseWords; | ||||||
| use Data::Dumper; | use Data::Dumper; | ||||||
| use Term::ANSIColor; | use Term::ANSIColor; | ||||||
| use File::Temp qw/ tempdir /; | use File::Temp qw/ tempdir /; | ||||||
|  | @ -359,6 +360,10 @@ foreach my $entry (@bcclist) { | ||||||
| 	die "Comma in --bcclist entry: $entry'\n" unless $entry !~ m/,/; | 	die "Comma in --bcclist entry: $entry'\n" unless $entry !~ m/,/; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | sub split_addrs { | ||||||
|  | 	return parse_line('\s*,\s*', 1, @_); | ||||||
|  | } | ||||||
|  |  | ||||||
| my %aliases; | my %aliases; | ||||||
| my %parse_alias = ( | my %parse_alias = ( | ||||||
| 	# multiline formats can be supported in the future | 	# multiline formats can be supported in the future | ||||||
|  | @ -367,7 +372,7 @@ my %parse_alias = ( | ||||||
| 			my ($alias, $addr) = ($1, $2); | 			my ($alias, $addr) = ($1, $2); | ||||||
| 			$addr =~ s/#.*$//; # mutt allows # comments | 			$addr =~ s/#.*$//; # mutt allows # comments | ||||||
| 			 # commas delimit multiple addresses | 			 # commas delimit multiple addresses | ||||||
| 			$aliases{$alias} = [ split(/\s*,\s*/, $addr) ]; | 			$aliases{$alias} = [ split_addrs($addr) ]; | ||||||
| 		}}}, | 		}}}, | ||||||
| 	mailrc => sub { my $fh = shift; while (<$fh>) { | 	mailrc => sub { my $fh = shift; while (<$fh>) { | ||||||
| 		if (/^alias\s+(\S+)\s+(.*)$/) { | 		if (/^alias\s+(\S+)\s+(.*)$/) { | ||||||
|  | @ -379,7 +384,7 @@ my %parse_alias = ( | ||||||
| 			chomp $x; | 			chomp $x; | ||||||
| 		        $x .= $1 while(defined($_ = <$fh>) && /^ +(.*)$/); | 		        $x .= $1 while(defined($_ = <$fh>) && /^ +(.*)$/); | ||||||
| 			$x =~ /^(\S+)$f\t\(?([^\t]+?)\)?(:?$f){0,2}$/ or next; | 			$x =~ /^(\S+)$f\t\(?([^\t]+?)\)?(:?$f){0,2}$/ or next; | ||||||
| 			$aliases{$1} = [ split(/\s*,\s*/, $2) ]; | 			$aliases{$1} = [ split_addrs($2) ]; | ||||||
| 		}}, | 		}}, | ||||||
| 	gnus => sub { my $fh = shift; while (<$fh>) { | 	gnus => sub { my $fh = shift; while (<$fh>) { | ||||||
| 		if (/\(define-mail-alias\s+"(\S+?)"\s+"(\S+?)"\)/) { | 		if (/\(define-mail-alias\s+"(\S+?)"\s+"(\S+?)"\)/) { | ||||||
|  | @ -588,7 +593,7 @@ if (!@to) { | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	my $to = $_; | 	my $to = $_; | ||||||
| 	push @to, split /,\s*/, $to; | 	push @to, split_addrs($to); | ||||||
| 	$prompting++; | 	$prompting++; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -56,6 +56,12 @@ M 644 :2 file2 | ||||||
| M 644 :3 file3 | M 644 :3 file3 | ||||||
| M 755 :4 file4 | M 755 :4 file4 | ||||||
|  |  | ||||||
|  | tag series-A | ||||||
|  | from :5 | ||||||
|  | data <<EOF | ||||||
|  | An annotated tag without a tagger | ||||||
|  | EOF | ||||||
|  |  | ||||||
| INPUT_END | INPUT_END | ||||||
| test_expect_success \ | test_expect_success \ | ||||||
|     'A: create pack from stdin' \ |     'A: create pack from stdin' \ | ||||||
|  | @ -101,6 +107,18 @@ test_expect_success \ | ||||||
| 	'A: verify file4' \ | 	'A: verify file4' \ | ||||||
| 	'git cat-file blob master:file4 >actual && test_cmp expect actual' | 	'git cat-file blob master:file4 >actual && test_cmp expect actual' | ||||||
|  |  | ||||||
|  | cat >expect <<EOF | ||||||
|  | object $(git rev-parse refs/heads/master) | ||||||
|  | type commit | ||||||
|  | tag series-A | ||||||
|  |  | ||||||
|  | An annotated tag without a tagger | ||||||
|  | EOF | ||||||
|  | test_expect_success 'A: verify tag/series-A' ' | ||||||
|  | 	git cat-file tag tags/series-A >actual && | ||||||
|  | 	test_cmp expect actual | ||||||
|  | ' | ||||||
|  |  | ||||||
| cat >expect <<EOF | cat >expect <<EOF | ||||||
| :2 `git rev-parse --verify master:file2` | :2 `git rev-parse --verify master:file2` | ||||||
| :3 `git rev-parse --verify master:file3` | :3 `git rev-parse --verify master:file3` | ||||||
|  |  | ||||||
|  | @ -239,4 +239,24 @@ test_expect_success 'fast-export | fast-import when master is tagged' ' | ||||||
|  |  | ||||||
| ' | ' | ||||||
|  |  | ||||||
|  | cat > tag-content << EOF | ||||||
|  | object $(git rev-parse HEAD) | ||||||
|  | type commit | ||||||
|  | tag rosten | ||||||
|  | EOF | ||||||
|  |  | ||||||
|  | test_expect_success 'cope with tagger-less tags' ' | ||||||
|  |  | ||||||
|  | 	TAG=$(git hash-object -t tag -w tag-content) && | ||||||
|  | 	git update-ref refs/tags/sonnenschein $TAG && | ||||||
|  | 	git fast-export -C -C --signed-tags=strip --all > output && | ||||||
|  | 	test $(grep -c "^tag " output) = 4 && | ||||||
|  | 	! grep "Unspecified Tagger" output && | ||||||
|  | 	git fast-export -C -C --signed-tags=strip --all \ | ||||||
|  | 		--fake-missing-tagger > output && | ||||||
|  | 	test $(grep -c "^tag " output) = 4 && | ||||||
|  | 	grep "Unspecified Tagger" output | ||||||
|  |  | ||||||
|  | ' | ||||||
|  |  | ||||||
| test_done | test_done | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano