Merge branch 'maint'

* maint:
  git.el: Retrieve commit log information from .dotest directory.
  git.el: Avoid appending a signoff line that is already present.
  setup_git_directory_gently: fix off-by-one error
  user-manual: install user manual stylesheet with other web documents
  user-manual: fix rendering of history diagrams
  user-manual: fix missing colon in git-show example
  user-manual: fix inconsistent use of pull and merge
  user-manual: fix inconsistent example
  glossary: fix overoptimistic automatic linking of defined terms
  Documentation: s/seperator/separator/
  Adjust reflog filemode in shared repository
This commit is contained in:
Junio C Hamano 2007-03-10 22:07:26 -08:00
commit ed287ab7fa
7 changed files with 100 additions and 48 deletions

View File

@ -462,7 +462,7 @@ in octal. Git only supports the following modes:
In both formats `<path>` is the complete path of the file to be added In both formats `<path>` is the complete path of the file to be added
(if not already existing) or modified (if already existing). (if not already existing) or modified (if already existing).
A `<path>` string must use UNIX-style directory seperators (forward A `<path>` string must use UNIX-style directory separators (forward
slash `/`), may contain any byte other than `LF`, and must not slash `/`), may contain any byte other than `LF`, and must not
start with double quote (`"`). start with double quote (`"`).
@ -472,8 +472,8 @@ quoting should be used, e.g. `"path/with\n and \" in it"`.
The value of `<path>` must be in canoncial form. That is it must not: The value of `<path>` must be in canoncial form. That is it must not:
* contain an empty directory component (e.g. `foo//bar` is invalid), * contain an empty directory component (e.g. `foo//bar` is invalid),
* end with a directory seperator (e.g. `foo/` is invalid), * end with a directory separator (e.g. `foo/` is invalid),
* start with a directory seperator (e.g. `/foo` is invalid), * start with a directory separator (e.g. `/foo` is invalid),
* contain the special component `.` or `..` (e.g. `foo/./bar` and * contain the special component `.` or `..` (e.g. `foo/./bar` and
`foo/../bar` are invalid). `foo/../bar` are invalid).

View File

@ -2,7 +2,7 @@
T="$1" T="$1"
for h in *.html *.txt howto/*.txt howto/*.html RelNotes-*.txt for h in *.html *.txt howto/*.txt howto/*.html RelNotes-*.txt *.css
do do
if test -f "$T/$h" && if test -f "$T/$h" &&
diff -u -I'Last updated [0-9][0-9]-[A-Z][a-z][a-z]-' "$T/$h" "$h" diff -u -I'Last updated [0-9][0-9]-[A-Z][a-z][a-z]-' "$T/$h" "$h"

View File

@ -48,7 +48,7 @@ This list is sorted alphabetically:
'; ';
@keys=sort {uc($a) cmp uc($b)} keys %terms; @keys=sort {uc($a) cmp uc($b)} keys %terms;
$pattern='(\b(?<!link:git-)'.join('\b|\b(?<!link:git-)',reverse @keys).'\b)'; $pattern='(\b(?<!link:git-)'.join('\b|\b(?<!-)',reverse @keys).'\b)';
foreach $key (@keys) { foreach $key (@keys) {
$terms{$key}=~s/$pattern/sprintf "<<ref_".no_spaces($1).",$1>>";/eg; $terms{$key}=~s/$pattern/sprintf "<<ref_".no_spaces($1).",$1>>";/eg;
print '[[ref_'.no_spaces($key).']]'.$key."::\n" print '[[ref_'.no_spaces($key).']]'.$key."::\n"

View File

@ -437,11 +437,14 @@ We will sometimes represent git history using diagrams like the one
below. Commits are shown as "o", and the links between them with below. Commits are shown as "o", and the links between them with
lines drawn with - / and \. Time goes left to right: lines drawn with - / and \. Time goes left to right:
................................................
o--o--o <-- Branch A o--o--o <-- Branch A
/ /
o--o--o <-- master o--o--o <-- master
\ \
o--o--o <-- Branch B o--o--o <-- Branch B
................................................
If we need to talk about a particular commit, the character "o" may If we need to talk about a particular commit, the character "o" may
be replaced with another letter or number. be replaced with another letter or number.
@ -601,8 +604,8 @@ a new stanza:
$ cat .git/config $ cat .git/config
... ...
[remote "linux-nfs"] [remote "linux-nfs"]
url = git://linux-nfs.org/~bfields/git.git url = git://linux-nfs.org/pub/nfs-2.6.git
fetch = +refs/heads/*:refs/remotes/linux-nfs-read/* fetch = +refs/heads/*:refs/remotes/linux-nfs/*
... ...
------------------------------------------------- -------------------------------------------------
@ -1133,17 +1136,9 @@ modified in two different ways in the remote branch and the local
branch--then you are warned; the output may look something like this: branch--then you are warned; the output may look something like this:
------------------------------------------------- -------------------------------------------------
$ git pull . next $ git merge next
Trying really trivial in-index merge... 100% (4/4) done
fatal: Merge requires file-level merging Auto-merged file.txt
Nope.
Merging HEAD with 77976da35a11db4580b80ae27e8d65caf5208086
Merging:
15e2162 world
77976da goodbye
found 1 common ancestor(s):
d122ed4 initial
Auto-merging file.txt
CONFLICT (content): Merge conflict in file.txt CONFLICT (content): Merge conflict in file.txt
Automatic merge failed; fix conflicts and then commit the result. Automatic merge failed; fix conflicts and then commit the result.
------------------------------------------------- -------------------------------------------------
@ -1439,7 +1434,7 @@ modifying the working directory, you can do that with
gitlink:git-show[1]: gitlink:git-show[1]:
------------------------------------------------- -------------------------------------------------
$ git show HEAD^ path/to/file $ git show HEAD^:path/to/file
------------------------------------------------- -------------------------------------------------
which will display the given version of the file. which will display the given version of the file.
@ -1936,25 +1931,29 @@ $ git commit
You have performed no merges into mywork, so it is just a simple linear You have performed no merges into mywork, so it is just a simple linear
sequence of patches on top of "origin": sequence of patches on top of "origin":
................................................
o--o--o <-- origin o--o--o <-- origin
\ \
o--o--o <-- mywork o--o--o <-- mywork
................................................
Some more interesting work has been done in the upstream project, and Some more interesting work has been done in the upstream project, and
"origin" has advanced: "origin" has advanced:
................................................
o--o--O--o--o--o <-- origin o--o--O--o--o--o <-- origin
\ \
a--b--c <-- mywork a--b--c <-- mywork
................................................
At this point, you could use "pull" to merge your changes back in; At this point, you could use "pull" to merge your changes back in;
the result would create a new merge commit, like this: the result would create a new merge commit, like this:
................................................
o--o--O--o--o--o <-- origin o--o--O--o--o--o <-- origin
\ \ \ \
a--b--c--m <-- mywork a--b--c--m <-- mywork
................................................
However, if you prefer to keep the history in mywork a simple series of However, if you prefer to keep the history in mywork a simple series of
commits without any merges, you may instead choose to use commits without any merges, you may instead choose to use
@ -1971,9 +1970,11 @@ point at the latest version of origin, then apply each of the saved
patches to the new mywork. The result will look like: patches to the new mywork. The result will look like:
................................................
o--o--O--o--o--o <-- origin o--o--O--o--o--o <-- origin
\ \
a'--b'--c' <-- mywork a'--b'--c' <-- mywork
................................................
In the process, it may discover conflicts. In that case it will stop In the process, it may discover conflicts. In that case it will stop
and allow you to fix the conflicts; after fixing conflicts, use "git and allow you to fix the conflicts; after fixing conflicts, use "git
@ -2081,24 +2082,30 @@ The primary problem with rewriting the history of a branch has to do
with merging. Suppose somebody fetches your branch and merges it into with merging. Suppose somebody fetches your branch and merges it into
their branch, with a result something like this: their branch, with a result something like this:
................................................
o--o--O--o--o--o <-- origin o--o--O--o--o--o <-- origin
\ \ \ \
t--t--t--m <-- their branch: t--t--t--m <-- their branch:
................................................
Then suppose you modify the last three commits: Then suppose you modify the last three commits:
................................................
o--o--o <-- new head of origin o--o--o <-- new head of origin
/ /
o--o--O--o--o--o <-- old head of origin o--o--O--o--o--o <-- old head of origin
................................................
If we examined all this history together in one repository, it will If we examined all this history together in one repository, it will
look like: look like:
................................................
o--o--o <-- new head of origin o--o--o <-- new head of origin
/ /
o--o--O--o--o--o <-- old head of origin o--o--O--o--o--o <-- old head of origin
\ \ \ \
t--t--t--m <-- their branch: t--t--t--m <-- their branch:
................................................
Git has no way of knowing that the new head is an updated version of Git has no way of knowing that the new head is an updated version of
the old head; it treats this situation exactly the same as it would if the old head; it treats this situation exactly the same as it would if
@ -2159,9 +2166,11 @@ commit. Git calls this process a "fast forward".
A fast forward looks something like this: A fast forward looks something like this:
................................................
o--o--o--o <-- old head of the branch o--o--o--o <-- old head of the branch
\ \
o--o--o <-- new head of the branch o--o--o <-- new head of the branch
................................................
In some cases it is possible that the new head will *not* actually be In some cases it is possible that the new head will *not* actually be
@ -2169,11 +2178,11 @@ a descendant of the old head. For example, the developer may have
realized she made a serious mistake, and decided to backtrack, realized she made a serious mistake, and decided to backtrack,
resulting in a situation like: resulting in a situation like:
................................................
o--o--o--o--a--b <-- old head of the branch o--o--o--o--a--b <-- old head of the branch
\ \
o--o--o <-- new head of the branch o--o--o <-- new head of the branch
................................................
In this case, "git fetch" will fail, and print out a warning. In this case, "git fetch" will fail, and print out a warning.

View File

@ -891,36 +891,77 @@ and returns the process output as a string."
(with-current-buffer log-edit-parent-buffer (with-current-buffer log-edit-parent-buffer
(git-get-filenames (git-marked-files-state 'added 'deleted 'modified)))) (git-get-filenames (git-marked-files-state 'added 'deleted 'modified))))
(defun git-append-sign-off (name email)
"Append a Signed-off-by entry to the current buffer, avoiding duplicates."
(let ((sign-off (format "Signed-off-by: %s <%s>" name email))
(case-fold-search t))
(goto-char (point-min))
(unless (re-search-forward (concat "^" (regexp-quote sign-off)) nil t)
(goto-char (point-min))
(unless (re-search-forward "^Signed-off-by: " nil t)
(setq sign-off (concat "\n" sign-off)))
(goto-char (point-max))
(insert sign-off "\n"))))
(defun git-setup-log-buffer (buffer &optional author-name author-email subject date msg)
"Setup the log buffer for a commit."
(unless git-status (error "Not in git-status buffer."))
(let ((merge-heads (git-get-merge-heads))
(dir default-directory)
(committer-name (git-get-committer-name))
(committer-email (git-get-committer-email))
(sign-off git-append-signed-off-by))
(with-current-buffer buffer
(cd dir)
(erase-buffer)
(insert
(propertize
(format "Author: %s <%s>\n%s%s"
(or author-name committer-name)
(or author-email committer-email)
(if date (format "Date: %s\n" date) "")
(if merge-heads
(format "Parent: %s\n%s\n"
(git-rev-parse "HEAD")
(mapconcat (lambda (str) (concat "Parent: " str)) merge-heads "\n"))
""))
'face 'git-header-face)
(propertize git-log-msg-separator 'face 'git-separator-face)
"\n")
(when subject (insert subject "\n\n"))
(cond (msg (insert msg "\n"))
((file-readable-p ".dotest/msg")
(insert-file-contents ".dotest/msg"))
((file-readable-p ".git/MERGE_MSG")
(insert-file-contents ".git/MERGE_MSG")))
; delete empty lines at end
(goto-char (point-min))
(when (re-search-forward "\n+\\'" nil t)
(replace-match "\n" t t))
(when sign-off (git-append-sign-off committer-name committer-email)))))
(defun git-commit-file () (defun git-commit-file ()
"Commit the marked file(s), asking for a commit message." "Commit the marked file(s), asking for a commit message."
(interactive) (interactive)
(unless git-status (error "Not in git-status buffer.")) (unless git-status (error "Not in git-status buffer."))
(let ((buffer (get-buffer-create "*git-commit*")) (let ((buffer (get-buffer-create "*git-commit*"))
(merge-heads (git-get-merge-heads))
(dir default-directory)
(coding-system (git-get-commits-coding-system)) (coding-system (git-get-commits-coding-system))
(sign-off git-append-signed-off-by)) author-name author-email subject date)
(with-current-buffer buffer (when (eq 0 (buffer-size buffer))
(when (eq 0 (buffer-size)) (when (file-readable-p ".dotest/info")
(cd dir) (with-temp-buffer
(erase-buffer) (insert-file-contents ".dotest/info")
(insert (goto-char (point-min))
(propertize (when (re-search-forward "^Author: \\(.*\\)\nEmail: \\(.*\\)$" nil t)
(format "Author: %s <%s>\n%s" (setq author-name (match-string 1))
(git-get-committer-name) (git-get-committer-email) (setq author-email (match-string 2)))
(if merge-heads (goto-char (point-min))
(format "Parent: %s\n%s\n" (when (re-search-forward "^Subject: \\(.*\\)$" nil t)
(git-rev-parse "HEAD") (setq subject (match-string 1)))
(mapconcat (lambda (str) (concat "Parent: " str)) merge-heads "\n")) (goto-char (point-min))
"")) (when (re-search-forward "^Date: \\(.*\\)$" nil t)
'face 'git-header-face) (setq date (match-string 1)))))
(propertize git-log-msg-separator 'face 'git-separator-face) (git-setup-log-buffer buffer author-name author-email subject date))
"\n")
(cond ((file-readable-p ".git/MERGE_MSG")
(insert-file-contents ".git/MERGE_MSG"))
(sign-off
(insert (format "\n\nSigned-off-by: %s <%s>\n"
(git-get-committer-name) (git-get-committer-email)))))))
(log-edit #'git-do-commit nil #'git-log-edit-files buffer) (log-edit #'git-do-commit nil #'git-log-edit-files buffer)
(setq font-lock-keywords (font-lock-compile-keywords git-log-edit-font-lock-keywords)) (setq font-lock-keywords (font-lock-compile-keywords git-log-edit-font-lock-keywords))
(setq buffer-file-coding-system coding-system) (setq buffer-file-coding-system coding-system)

2
refs.c
View File

@ -921,6 +921,8 @@ static int log_ref_write(const char *ref_name, const unsigned char *old_sha1,
log_file, strerror(errno)); log_file, strerror(errno));
} }
adjust_shared_perm(log_file);
msglen = 0; msglen = 0;
if (msg) { if (msg) {
/* clean up the message and make sure it is a single line */ /* clean up the message and make sure it is a single line */

View File

@ -216,7 +216,7 @@ const char *setup_git_directory_gently(int *nongit_ok)
die("Not a git repository: '%s'", gitdirenv); die("Not a git repository: '%s'", gitdirenv);
} }
if (!getcwd(cwd, sizeof(cwd)) || cwd[0] != '/') if (!getcwd(cwd, sizeof(cwd)-1) || cwd[0] != '/')
die("Unable to read current working directory"); die("Unable to read current working directory");
offset = len = strlen(cwd); offset = len = strlen(cwd);