mirror of
https://github.com/git/git.git
synced 2026-03-13 10:23:30 +01:00
Merge branch 'master' of git://repo.or.cz/alt-git
This commit is contained in:
@@ -150,6 +150,9 @@ v1.6.1.X series.
|
||||
* "git filter-branch" incorrectly tried to update a nonexistent work tree
|
||||
at the end when it is run in a bare repository.
|
||||
|
||||
* "git gc" did not work if your repository was created with an ancient git
|
||||
and never had any pack files in it before.
|
||||
|
||||
* "git mergetool" used to ignore autocrlf and other attributes
|
||||
based content rewriting.
|
||||
|
||||
@@ -162,6 +165,6 @@ v1.6.1.X series.
|
||||
|
||||
--
|
||||
exec >/var/tmp/1
|
||||
v1.6.2-rc0-89-gf7a2bdb
|
||||
O=v1.6.2-rc2
|
||||
echo O=$(git describe master)
|
||||
git shortlog --no-merges $O..master ^maint
|
||||
|
||||
@@ -41,6 +41,13 @@ of lines before or after the line given by <start>.
|
||||
-S <revs-file>::
|
||||
Use revs from revs-file instead of calling linkgit:git-rev-list[1].
|
||||
|
||||
--reverse::
|
||||
Walk history forward instead of backward. Instead of showing
|
||||
the revision in which a line appeared, this shows the last
|
||||
revision in which a line has existed. This requires a range of
|
||||
revision like START..END where the path to blame exists in
|
||||
START.
|
||||
|
||||
-p::
|
||||
--porcelain::
|
||||
Show in a format designed for machine consumption.
|
||||
|
||||
@@ -10,7 +10,7 @@ SYNOPSIS
|
||||
[verse]
|
||||
'git blame' [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-p] [-w] [--incremental] [-L n,m]
|
||||
[-S <revs-file>] [-M] [-C] [-C] [--since=<date>]
|
||||
[<rev> | --contents <file>] [--] <file>
|
||||
[<rev> | --contents <file> | --reverse <rev>] [--] <file>
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
|
||||
@@ -9,7 +9,7 @@ git-push - Update remote refs along with associated objects
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'git push' [--all | --mirror] [--dry-run] [--tags] [--receive-pack=<git-receive-pack>]
|
||||
'git push' [--all | --mirror | --tags] [--dry-run] [--receive-pack=<git-receive-pack>]
|
||||
[--repo=<repository>] [-f | --force] [-v | --verbose]
|
||||
[<repository> <refspec>...]
|
||||
|
||||
@@ -48,17 +48,19 @@ push. Arbitrary expressions cannot be used here, an actual ref must
|
||||
be named. If `:`<dst> is omitted, the same ref as <src> will be
|
||||
updated.
|
||||
+
|
||||
The object referenced by <src> is used to fast forward the ref <dst>
|
||||
on the remote side. If the optional leading plus `{plus}` is used, the
|
||||
remote ref is updated even if it does not result in a fast forward
|
||||
update.
|
||||
The object referenced by <src> is used to update the <dst> reference
|
||||
on the remote side, but by default this is only allowed if the
|
||||
update can fast forward <dst>. By having the optional leading `{plus}`,
|
||||
you can tell git to update the <dst> ref even when the update is not a
|
||||
fast forward. This does *not* attempt to merge <src> into <dst>. See
|
||||
EXAMPLES below for details.
|
||||
+
|
||||
`tag <tag>` means the same as `refs/tags/<tag>:refs/tags/<tag>`.
|
||||
+
|
||||
Pushing an empty <src> allows you to delete the <dst> ref from
|
||||
the remote repository.
|
||||
+
|
||||
The special refspec `:` (or `+:` to allow non-fast forward updates)
|
||||
The special refspec `:` (or `{plus}:` to allow non-fast forward updates)
|
||||
directs git to push "matching" branches: for every branch that exists on
|
||||
the local side, the remote side is updated if a branch of the same name
|
||||
already exists on the remote side. This is the default operation mode
|
||||
@@ -218,6 +220,30 @@ git push origin :experimental::
|
||||
Find a ref that matches `experimental` in the `origin` repository
|
||||
(e.g. `refs/heads/experimental`), and delete it.
|
||||
|
||||
git push origin {plus}dev:master::
|
||||
Update the origin repository's master branch with the dev branch,
|
||||
allowing non-fast forward updates. *This can leave unreferenced
|
||||
commits dangling in the origin repository.* Consider the
|
||||
following situation, where a fast forward is not possible:
|
||||
+
|
||||
----
|
||||
o---o---o---A---B origin/master
|
||||
\
|
||||
X---Y---Z dev
|
||||
----
|
||||
+
|
||||
The above command would change the origin repository to
|
||||
+
|
||||
----
|
||||
A---B (unnamed branch)
|
||||
/
|
||||
o---o---o---X---Y---Z master
|
||||
----
|
||||
+
|
||||
Commits A and B would no longer belong to a branch with a symbolic name,
|
||||
and so would be unreachable. As such, these commits would be removed by
|
||||
a `git gc` command on the origin repository.
|
||||
|
||||
|
||||
Author
|
||||
------
|
||||
|
||||
@@ -19,6 +19,19 @@ The header of the email is configurable by command line options. If not
|
||||
specified on the command line, the user will be prompted with a ReadLine
|
||||
enabled interface to provide the necessary information.
|
||||
|
||||
There are two formats accepted for patch files:
|
||||
|
||||
1. mbox format files
|
||||
+
|
||||
This is what linkgit:git-format-patch[1] generates. Most headers and MIME
|
||||
formatting are ignored.
|
||||
|
||||
2. The original format used by Greg Kroah-Hartman's 'send_lots_of_email.pl'
|
||||
script
|
||||
+
|
||||
This format expects the first line of the file to contain the "Cc:" value
|
||||
and the "Subject:" of the message as the second line.
|
||||
|
||||
|
||||
OPTIONS
|
||||
-------
|
||||
|
||||
@@ -169,6 +169,10 @@ and have no uncommitted changes.
|
||||
reused if a user is later given access to an alternate transport
|
||||
method (e.g. `svn+ssh://` or `https://`) for commit.
|
||||
|
||||
config key: svn-remote.<name>.commiturl
|
||||
|
||||
config key: svn.commiturl (overwrites all svn-remote.<name>.commiturl options)
|
||||
|
||||
Using this option for any other purpose (don't ask)
|
||||
is very strongly discouraged.
|
||||
--
|
||||
|
||||
@@ -18,10 +18,10 @@ A `gitattributes` file is a simple text file that gives
|
||||
|
||||
Each line in `gitattributes` file is of form:
|
||||
|
||||
glob attr1 attr2 ...
|
||||
pattern attr1 attr2 ...
|
||||
|
||||
That is, a glob pattern followed by an attributes list,
|
||||
separated by whitespaces. When the glob pattern matches the
|
||||
That is, a pattern followed by an attributes list,
|
||||
separated by whitespaces. When the pattern matches the
|
||||
path in question, the attributes listed on the line are given to
|
||||
the path.
|
||||
|
||||
@@ -48,13 +48,14 @@ Set to a value::
|
||||
|
||||
Unspecified::
|
||||
|
||||
No glob pattern matches the path, and nothing says if
|
||||
No pattern matches the path, and nothing says if
|
||||
the path has or does not have the attribute, the
|
||||
attribute for the path is said to be Unspecified.
|
||||
|
||||
When more than one glob pattern matches the path, a later line
|
||||
When more than one pattern matches the path, a later line
|
||||
overrides an earlier line. This overriding is done per
|
||||
attribute.
|
||||
attribute. The rules how the pattern matches paths are the
|
||||
same as in `.gitignore` files; see linkgit:gitignore[5].
|
||||
|
||||
When deciding what attributes are assigned to a path, git
|
||||
consults `$GIT_DIR/info/attributes` file (which has the highest
|
||||
|
||||
@@ -13,7 +13,7 @@ include::pretty-options.txt[]
|
||||
|
||||
Synonym for `--date=relative`.
|
||||
|
||||
--date={relative,local,default,iso,rfc,short}::
|
||||
--date={relative,local,default,iso,rfc,short,raw}::
|
||||
|
||||
Only takes effect for dates shown in human-readable format, such
|
||||
as when using "--pretty". `log.date` config variable sets a default
|
||||
@@ -31,6 +31,8 @@ format, often found in E-mail messages.
|
||||
+
|
||||
`--date=short` shows only date but not time, in `YYYY-MM-DD` format.
|
||||
+
|
||||
`--date=raw` shows the date in the internal raw git format `%s %z` format.
|
||||
+
|
||||
`--date=default` shows timestamps in the original timezone
|
||||
(either committer's or author's).
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
GVF=GIT-VERSION-FILE
|
||||
DEF_VER=v1.6.1.GIT
|
||||
DEF_VER=v1.6.2-rc2.GIT
|
||||
|
||||
LF='
|
||||
'
|
||||
|
||||
4
Makefile
4
Makefile
@@ -1468,8 +1468,8 @@ endif
|
||||
bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \
|
||||
execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \
|
||||
{ $(RM) "$$execdir/git-add$X" && \
|
||||
ln git-add$X "$$execdir/git-add$X" 2>/dev/null || \
|
||||
cp git-add$X "$$execdir/git-add$X"; } && \
|
||||
ln "$$bindir/git$X" "$$execdir/git-add$X" 2>/dev/null || \
|
||||
cp "$$bindir/git$X" "$$execdir/git-add$X"; } && \
|
||||
{ for p in $(filter-out git-add$X,$(BUILT_INS)); do \
|
||||
$(RM) "$$execdir/$$p" && \
|
||||
ln "$$execdir/git-add$X" "$$execdir/$$p" 2>/dev/null || \
|
||||
|
||||
14
README
14
README
@@ -24,10 +24,18 @@ It was originally written by Linus Torvalds with help of a group of
|
||||
hackers around the net. It is currently maintained by Junio C Hamano.
|
||||
|
||||
Please read the file INSTALL for installation instructions.
|
||||
|
||||
See Documentation/gittutorial.txt to get started, then see
|
||||
Documentation/everyday.txt for a useful minimum set of commands,
|
||||
and "man git-commandname" for documentation of each command.
|
||||
CVS users may also want to read Documentation/cvs-migration.txt.
|
||||
Documentation/everyday.txt for a useful minimum set of commands, and
|
||||
Documentation/git-commandname.txt for documentation of each command.
|
||||
If git has been correctly installed, then the tutorial can also be
|
||||
read with "man gittutorial" or "git help tutorial", and the
|
||||
documentation of each command with "man git-commandname" or "git help
|
||||
commandname".
|
||||
|
||||
CVS users may also want to read Documentation/gitcvs-migration.txt
|
||||
("man gitcvs-migration" or "git help cvs-migration" if git is
|
||||
installed).
|
||||
|
||||
Many Git online resources are accessible from http://git.or.cz/
|
||||
including full documentation and Git related tools.
|
||||
|
||||
@@ -15,7 +15,7 @@ static const char * const builtin_add_usage[] = {
|
||||
"git add [options] [--] <filepattern>...",
|
||||
NULL
|
||||
};
|
||||
static int patch_interactive = 0, add_interactive = 0;
|
||||
static int patch_interactive, add_interactive;
|
||||
static int take_worktree_changes;
|
||||
|
||||
static void fill_pathspec_matches(const char **pathspec, char *seen, int specs)
|
||||
|
||||
@@ -488,9 +488,8 @@ static void write_pack_file(void)
|
||||
} else {
|
||||
char tmpname[PATH_MAX];
|
||||
int fd;
|
||||
snprintf(tmpname, sizeof(tmpname),
|
||||
"%s/pack/tmp_pack_XXXXXX", get_object_directory());
|
||||
fd = xmkstemp(tmpname);
|
||||
fd = odb_mkstemp(tmpname, sizeof(tmpname),
|
||||
"pack/tmp_pack_XXXXXX");
|
||||
pack_tmp_name = xstrdup(tmpname);
|
||||
f = sha1fd(fd, pack_tmp_name);
|
||||
}
|
||||
|
||||
@@ -742,8 +742,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
|
||||
if (newfd < 0) {
|
||||
if (refresh_flags & REFRESH_QUIET)
|
||||
exit(128);
|
||||
die("unable to create '%s.lock': %s",
|
||||
get_index_file(), strerror(lock_error));
|
||||
unable_to_lock_index_die(get_index_file(), lock_error);
|
||||
}
|
||||
if (write_cache(newfd, active_cache, active_nr) ||
|
||||
commit_locked_index(lock_file))
|
||||
|
||||
5
cache.h
5
cache.h
@@ -484,6 +484,7 @@ struct lock_file {
|
||||
};
|
||||
#define LOCK_DIE_ON_ERROR 1
|
||||
#define LOCK_NODEREF 2
|
||||
extern NORETURN void unable_to_lock_index_die(const char *path, int err);
|
||||
extern int hold_lock_file_for_update(struct lock_file *, const char *path, int);
|
||||
extern int hold_lock_file_for_append(struct lock_file *, const char *path, int);
|
||||
extern int commit_lock_file(struct lock_file *);
|
||||
@@ -626,6 +627,7 @@ const char *make_nonrelative_path(const char *path);
|
||||
const char *make_relative_path(const char *abs, const char *base);
|
||||
int normalize_path_copy(char *dst, const char *src);
|
||||
int longest_ancestor_length(const char *path, const char *prefix_list);
|
||||
char *strip_path_suffix(const char *path, const char *suffix);
|
||||
|
||||
/* Read and unpack a sha1 file into memory, write memory to a sha1 file */
|
||||
extern int sha1_object_info(const unsigned char *, unsigned long *);
|
||||
@@ -694,7 +696,8 @@ enum date_mode {
|
||||
DATE_SHORT,
|
||||
DATE_LOCAL,
|
||||
DATE_ISO8601,
|
||||
DATE_RFC2822
|
||||
DATE_RFC2822,
|
||||
DATE_RAW
|
||||
};
|
||||
|
||||
const char *show_date(unsigned long time, int timezone, enum date_mode mode);
|
||||
|
||||
@@ -975,6 +975,27 @@ _git_ls_tree ()
|
||||
__git_complete_file
|
||||
}
|
||||
|
||||
# Options that go well for log, shortlog and gitk
|
||||
__git_log_common_options="
|
||||
--not --all
|
||||
--branches --tags --remotes
|
||||
--first-parent --no-merges
|
||||
--max-count=
|
||||
--max-age= --since= --after=
|
||||
--min-age= --until= --before=
|
||||
"
|
||||
# Options that go well for log and gitk (not shortlog)
|
||||
__git_log_gitk_options="
|
||||
--dense --sparse --full-history
|
||||
--simplify-merges --simplify-by-decoration
|
||||
--left-right
|
||||
"
|
||||
# Options that go well for log and shortlog (not gitk)
|
||||
__git_log_shortlog_options="
|
||||
--author= --committer= --grep=
|
||||
--all-match
|
||||
"
|
||||
|
||||
__git_log_pretty_formats="oneline short medium full fuller email raw format:"
|
||||
|
||||
_git_log ()
|
||||
@@ -982,6 +1003,11 @@ _git_log ()
|
||||
__git_has_doubledash && return
|
||||
|
||||
local cur="${COMP_WORDS[COMP_CWORD]}"
|
||||
local g="$(git rev-parse --git-dir 2>/dev/null)"
|
||||
local merge=""
|
||||
if [ -f $g/MERGE_HEAD ]; then
|
||||
merge="--merge"
|
||||
fi
|
||||
case "$cur" in
|
||||
--pretty=*)
|
||||
__gitcomp "$__git_log_pretty_formats
|
||||
@@ -996,22 +1022,20 @@ _git_log ()
|
||||
;;
|
||||
--*)
|
||||
__gitcomp "
|
||||
--max-count= --max-age= --since= --after=
|
||||
--min-age= --before= --until=
|
||||
$__git_log_common_options
|
||||
$__git_log_shortlog_options
|
||||
$__git_log_gitk_options
|
||||
--root --topo-order --date-order --reverse
|
||||
--no-merges --follow
|
||||
--follow
|
||||
--abbrev-commit --abbrev=
|
||||
--relative-date --date=
|
||||
--author= --committer= --grep=
|
||||
--all-match
|
||||
--pretty=
|
||||
--not --all
|
||||
--left-right --cherry-pick
|
||||
--cherry-pick
|
||||
--graph
|
||||
--decorate
|
||||
--walk-reflogs
|
||||
--parents --children --full-history
|
||||
--merge
|
||||
--parents --children
|
||||
$merge
|
||||
$__git_diff_common_options
|
||||
--pickaxe-all --pickaxe-regex
|
||||
"
|
||||
@@ -1496,12 +1520,8 @@ _git_shortlog ()
|
||||
case "$cur" in
|
||||
--*)
|
||||
__gitcomp "
|
||||
--max-count= --max-age= --since= --after=
|
||||
--min-age= --before= --until=
|
||||
--no-merges
|
||||
--author= --committer= --grep=
|
||||
--all-match
|
||||
--not --all
|
||||
$__git_log_common_options
|
||||
$__git_log_shortlog_options
|
||||
--numbered --summary
|
||||
"
|
||||
return
|
||||
@@ -1828,7 +1848,11 @@ _gitk ()
|
||||
fi
|
||||
case "$cur" in
|
||||
--*)
|
||||
__gitcomp "--not --all $merge"
|
||||
__gitcomp "
|
||||
$__git_log_common_options
|
||||
$__git_log_gitk_options
|
||||
$merge
|
||||
"
|
||||
return
|
||||
;;
|
||||
esac
|
||||
|
||||
39
contrib/emacs/README
Normal file
39
contrib/emacs/README
Normal file
@@ -0,0 +1,39 @@
|
||||
This directory contains various modules for Emacs support.
|
||||
|
||||
To make the modules available to Emacs, you should add this directory
|
||||
to your load-path, and then require the modules you want. This can be
|
||||
done by adding to your .emacs something like this:
|
||||
|
||||
(add-to-list 'load-path ".../git/contrib/emacs")
|
||||
(require 'git)
|
||||
(require 'git-blame)
|
||||
|
||||
|
||||
The following modules are available:
|
||||
|
||||
* git.el:
|
||||
|
||||
Status manager that displays the state of all the files of the
|
||||
project, and provides easy access to the most frequently used git
|
||||
commands. The user interface is as far as possible compatible with
|
||||
the pcl-cvs mode. It can be started with `M-x git-status'.
|
||||
|
||||
* git-blame.el:
|
||||
|
||||
Emacs implementation of incremental git-blame. When you turn it on
|
||||
while viewing a file, the editor buffer will be updated by setting
|
||||
the background of individual lines to a color that reflects which
|
||||
commit it comes from. And when you move around the buffer, a
|
||||
one-line summary will be shown in the echo area.
|
||||
|
||||
* vc-git.el:
|
||||
|
||||
This file used to contain the VC-mode backend for git, but it is no
|
||||
longer distributed with git. It is now maintained as part of Emacs
|
||||
and included in standard Emacs distributions starting from version
|
||||
22.2.
|
||||
|
||||
If you have an earlier Emacs version, upgrading to Emacs 22 is
|
||||
recommended, since the VC mode in older Emacs is not generic enough
|
||||
to be able to support git in a reasonable manner, and no attempt has
|
||||
been made to backport vc-git.el.
|
||||
@@ -530,9 +530,9 @@ Each entry is a cons of (SHORT-NAME . FULL-NAME)."
|
||||
(git-fileinfo->needs-refresh info) t)))
|
||||
|
||||
(defun git-status-filenames-map (status func files &rest args)
|
||||
"Apply FUNC to the status files names in the FILES list."
|
||||
"Apply FUNC to the status files names in the FILES list.
|
||||
The list must be sorted."
|
||||
(when files
|
||||
(setq files (sort files #'string-lessp))
|
||||
(let ((file (pop files))
|
||||
(node (ewoc-nth status 0)))
|
||||
(while (and file node)
|
||||
@@ -545,7 +545,7 @@ Each entry is a cons of (SHORT-NAME . FULL-NAME)."
|
||||
(setq file (pop files))))))))
|
||||
|
||||
(defun git-set-filenames-state (status files state)
|
||||
"Set the state of a list of named files."
|
||||
"Set the state of a list of named files. The list must be sorted"
|
||||
(when files
|
||||
(git-status-filenames-map status #'git-set-fileinfo-state files state)
|
||||
(unless state ;; delete files whose state has been set to nil
|
||||
@@ -750,6 +750,7 @@ Return the list of files that haven't been handled."
|
||||
(let (unmerged-files)
|
||||
(while (re-search-forward "[0-7]\\{6\\} [0-9a-f]\\{40\\} [123]\t\\([^\0]+\\)\0" nil t)
|
||||
(push (match-string 1) unmerged-files))
|
||||
(setq unmerged-files (nreverse unmerged-files)) ;; assume it is sorted already
|
||||
(git-set-filenames-state status unmerged-files 'unmerged))))
|
||||
|
||||
(defun git-get-exclude-files ()
|
||||
@@ -770,17 +771,18 @@ Return the list of files that haven't been handled."
|
||||
(append options (mapcar (lambda (f) (concat "--exclude-from=" f)) exclude-files)))))
|
||||
|
||||
(defun git-update-status-files (&optional files mark-files)
|
||||
"Update the status of FILES from the index."
|
||||
"Update the status of FILES from the index.
|
||||
The FILES list must be sorted."
|
||||
(unless git-status (error "Not in git-status buffer."))
|
||||
;; set the needs-update flag on existing files
|
||||
(if (setq files (sort files #'string-lessp))
|
||||
(if files
|
||||
(git-status-filenames-map
|
||||
git-status (lambda (info) (setf (git-fileinfo->needs-update info) t)) files)
|
||||
(ewoc-map (lambda (info) (setf (git-fileinfo->needs-update info) t) nil) git-status)
|
||||
(git-call-process nil "update-index" "--refresh")
|
||||
(when git-show-uptodate
|
||||
(git-run-ls-files-cached git-status nil 'uptodate)))
|
||||
(let* ((remaining-files
|
||||
(let ((remaining-files
|
||||
(if (git-empty-db-p) ; we need some special handling for an empty db
|
||||
(git-run-ls-files-cached git-status files 'added)
|
||||
(git-run-diff-index git-status files))))
|
||||
@@ -825,13 +827,13 @@ Return the list of files that haven't been handled."
|
||||
(list (ewoc-data (ewoc-locate git-status)))))
|
||||
|
||||
(defun git-marked-files-state (&rest states)
|
||||
"Return marked files that are in the specified states."
|
||||
"Return a sorted list of marked files that are in the specified states."
|
||||
(let ((files (git-marked-files))
|
||||
result)
|
||||
(dolist (info files)
|
||||
(when (memq (git-fileinfo->state info) states)
|
||||
(push info result)))
|
||||
result))
|
||||
(nreverse result)))
|
||||
|
||||
(defun git-refresh-files ()
|
||||
"Refresh all files that need it and clear the needs-refresh flag."
|
||||
@@ -1066,7 +1068,9 @@ Return the list of files that haven't been handled."
|
||||
(unless files
|
||||
(push (file-relative-name (read-file-name "File to remove: " nil nil t)) files))
|
||||
(if (yes-or-no-p
|
||||
(format "Remove %d file%s? " (length files) (if (> (length files) 1) "s" "")))
|
||||
(if (cdr files)
|
||||
(format "Remove %d files? " (length files))
|
||||
(format "Remove %s? " (car files))))
|
||||
(progn
|
||||
(dolist (name files)
|
||||
(ignore-errors
|
||||
@@ -1085,7 +1089,9 @@ Return the list of files that haven't been handled."
|
||||
added modified)
|
||||
(when (and files
|
||||
(yes-or-no-p
|
||||
(format "Revert %d file%s? " (length files) (if (> (length files) 1) "s" ""))))
|
||||
(if (cdr files)
|
||||
(format "Revert %d files? " (length files))
|
||||
(format "Revert %s? " (git-fileinfo->name (car files))))))
|
||||
(dolist (info files)
|
||||
(case (git-fileinfo->state info)
|
||||
('added (push (git-fileinfo->name info) added))
|
||||
@@ -1101,13 +1107,14 @@ Return the list of files that haven't been handled."
|
||||
(or (not added)
|
||||
(apply 'git-call-process-display-error "update-index" "--force-remove" "--" added))
|
||||
(or (not modified)
|
||||
(apply 'git-call-process-display-error "checkout" "HEAD" modified)))))
|
||||
(git-update-status-files (append added modified))
|
||||
(apply 'git-call-process-display-error "checkout" "HEAD" modified))))
|
||||
(names (git-get-filenames files)))
|
||||
(git-update-status-files names)
|
||||
(when ok
|
||||
(dolist (file modified)
|
||||
(let ((buffer (get-file-buffer file)))
|
||||
(when buffer (with-current-buffer buffer (revert-buffer t t t)))))
|
||||
(git-success-message "Reverted" (git-get-filenames files)))))))
|
||||
(git-success-message "Reverted" names))))))
|
||||
|
||||
(defun git-resolve-file ()
|
||||
"Resolve conflicts in marked file(s)."
|
||||
@@ -1365,14 +1372,14 @@ Return the list of files that haven't been handled."
|
||||
(mapconcat #'identity msg "\n"))))
|
||||
|
||||
(defun git-get-commit-files (commit)
|
||||
"Retrieve the list of files modified by COMMIT."
|
||||
"Retrieve a sorted list of files modified by COMMIT."
|
||||
(let (files)
|
||||
(with-temp-buffer
|
||||
(git-call-process t "diff-tree" "-m" "-r" "-z" "--name-only" "--no-commit-id" "--root" commit)
|
||||
(goto-char (point-min))
|
||||
(while (re-search-forward "\\([^\0]*\\)\0" nil t 1)
|
||||
(push (match-string 1) files)))
|
||||
files))
|
||||
(sort files #'string-lessp)))
|
||||
|
||||
(defun git-read-commit-name (prompt &optional default)
|
||||
"Ask for a commit name, with completion for local branch, remote branch and tag."
|
||||
|
||||
@@ -287,9 +287,9 @@ my $last_rev = "";
|
||||
my $last_branch;
|
||||
my $current_rev = $opt_s || 1;
|
||||
unless(-d $git_dir) {
|
||||
system("git-init");
|
||||
system("git init");
|
||||
die "Cannot init the GIT db at $git_tree: $?\n" if $?;
|
||||
system("git-read-tree");
|
||||
system("git read-tree");
|
||||
die "Cannot init an empty tree: $?\n" if $?;
|
||||
|
||||
$last_branch = $opt_o;
|
||||
@@ -303,7 +303,7 @@ unless(-d $git_dir) {
|
||||
-f "$git_dir/svn2git"
|
||||
or die "'$git_dir/svn2git' does not exist.\n".
|
||||
"You need that file for incremental imports.\n";
|
||||
open(F, "git-symbolic-ref HEAD |") or
|
||||
open(F, "git symbolic-ref HEAD |") or
|
||||
die "Cannot run git-symbolic-ref: $!\n";
|
||||
chomp ($last_branch = <F>);
|
||||
$last_branch = basename($last_branch);
|
||||
@@ -331,7 +331,7 @@ EOM
|
||||
"$git_dir/refs/heads/$opt_o") == 0;
|
||||
|
||||
# populate index
|
||||
system('git-read-tree', $last_rev);
|
||||
system('git', 'read-tree', $last_rev);
|
||||
die "read-tree failed: $?\n" if $?;
|
||||
|
||||
# Get the last import timestamps
|
||||
@@ -399,7 +399,7 @@ sub get_file($$$) {
|
||||
my $pid = open(my $F, '-|');
|
||||
die $! unless defined $pid;
|
||||
if (!$pid) {
|
||||
exec("git-hash-object", "-w", $name)
|
||||
exec("git", "hash-object", "-w", $name)
|
||||
or die "Cannot create object: $!\n";
|
||||
}
|
||||
my $sha = <$F>;
|
||||
@@ -423,7 +423,7 @@ sub get_ignore($$$$$) {
|
||||
my $pid = open(my $F, '-|');
|
||||
die $! unless defined $pid;
|
||||
if (!$pid) {
|
||||
exec("git-hash-object", "-w", $name)
|
||||
exec("git", "hash-object", "-w", $name)
|
||||
or die "Cannot create object: $!\n";
|
||||
}
|
||||
my $sha = <$F>;
|
||||
@@ -547,7 +547,7 @@ sub copy_path($$$$$$$$) {
|
||||
my $pid = open my $f,'-|';
|
||||
die $! unless defined $pid;
|
||||
if (!$pid) {
|
||||
exec("git-ls-tree","-r","-z",$gitrev,$srcpath)
|
||||
exec("git","ls-tree","-r","-z",$gitrev,$srcpath)
|
||||
or die $!;
|
||||
}
|
||||
local $/ = "\0";
|
||||
@@ -634,7 +634,7 @@ sub commit {
|
||||
|
||||
my $rev;
|
||||
if($revision > $opt_s and defined $parent) {
|
||||
open(H,'-|',"git-rev-parse","--verify",$parent);
|
||||
open(H,'-|',"git","rev-parse","--verify",$parent);
|
||||
$rev = <H>;
|
||||
close(H) or do {
|
||||
print STDERR "$revision: cannot find commit '$parent'!\n";
|
||||
@@ -671,7 +671,7 @@ sub commit {
|
||||
unlink($git_index);
|
||||
} elsif ($rev ne $last_rev) {
|
||||
print "Switching from $last_rev to $rev ($branch)\n" if $opt_v;
|
||||
system("git-read-tree", $rev);
|
||||
system("git", "read-tree", $rev);
|
||||
die "read-tree failed for $rev: $?\n" if $?;
|
||||
$last_rev = $rev;
|
||||
}
|
||||
@@ -740,7 +740,7 @@ sub commit {
|
||||
my $pid = open my $F, "-|";
|
||||
die "$!" unless defined $pid;
|
||||
if (!$pid) {
|
||||
exec("git-ls-files", "-z", @o1) or die $!;
|
||||
exec("git", "ls-files", "-z", @o1) or die $!;
|
||||
}
|
||||
@o1 = ();
|
||||
local $/ = "\0";
|
||||
@@ -758,7 +758,7 @@ sub commit {
|
||||
@o2 = @o1;
|
||||
@o1 = ();
|
||||
}
|
||||
system("git-update-index","--force-remove","--",@o2);
|
||||
system("git","update-index","--force-remove","--",@o2);
|
||||
die "Cannot remove files: $?\n" if $?;
|
||||
}
|
||||
}
|
||||
@@ -770,7 +770,7 @@ sub commit {
|
||||
@n2 = @new;
|
||||
@new = ();
|
||||
}
|
||||
system("git-update-index","--add",
|
||||
system("git","update-index","--add",
|
||||
(map { ('--cacheinfo', @$_) } @n2));
|
||||
die "Cannot add files: $?\n" if $?;
|
||||
}
|
||||
@@ -778,7 +778,7 @@ sub commit {
|
||||
my $pid = open(C,"-|");
|
||||
die "Cannot fork: $!" unless defined $pid;
|
||||
unless($pid) {
|
||||
exec("git-write-tree");
|
||||
exec("git","write-tree");
|
||||
die "Cannot exec git-write-tree: $!\n";
|
||||
}
|
||||
chomp(my $tree = <C>);
|
||||
@@ -830,7 +830,7 @@ sub commit {
|
||||
"GIT_COMMITTER_NAME=$committer_name",
|
||||
"GIT_COMMITTER_EMAIL=$committer_email",
|
||||
"GIT_COMMITTER_DATE=".strftime("+0000 %Y-%m-%d %H:%M:%S",gmtime($date)),
|
||||
"git-commit-tree", $tree,@par);
|
||||
"git", "commit-tree", $tree,@par);
|
||||
die "Cannot exec git-commit-tree: $!\n";
|
||||
}
|
||||
$pw->writer();
|
||||
@@ -874,7 +874,7 @@ sub commit {
|
||||
|
||||
$dest =~ tr/_/\./ if $opt_u;
|
||||
|
||||
system('git-tag', '-f', $dest, $cid) == 0
|
||||
system('git', 'tag', '-f', $dest, $cid) == 0
|
||||
or die "Cannot create tag $dest: $!\n";
|
||||
|
||||
print "Created tag '$dest' on '$branch'\n" if $opt_v;
|
||||
@@ -937,7 +937,7 @@ while ($to_rev < $opt_l) {
|
||||
my $pid = fork();
|
||||
die "Fork: $!\n" unless defined $pid;
|
||||
unless($pid) {
|
||||
exec("git-repack", "-d")
|
||||
exec("git", "repack", "-d")
|
||||
or die "Cannot repack: $!\n";
|
||||
}
|
||||
waitpid($pid, 0);
|
||||
@@ -958,7 +958,7 @@ if($orig_branch) {
|
||||
system("cp","$git_dir/refs/heads/$opt_o","$git_dir/refs/heads/master")
|
||||
if $forward_master;
|
||||
unless ($opt_i) {
|
||||
system('git-read-tree', '-m', '-u', 'SVN2GIT_HEAD', 'HEAD');
|
||||
system('git', 'read-tree', '-m', '-u', 'SVN2GIT_HEAD', 'HEAD');
|
||||
die "read-tree failed: $?\n" if $?;
|
||||
}
|
||||
} else {
|
||||
@@ -966,7 +966,7 @@ if($orig_branch) {
|
||||
print "DONE; creating $orig_branch branch\n" if $opt_v and (not defined $opt_l or $opt_l > 0);
|
||||
system("cp","$git_dir/refs/heads/$opt_o","$git_dir/refs/heads/master")
|
||||
unless -f "$git_dir/refs/heads/master";
|
||||
system('git-update-ref', 'HEAD', "$orig_branch");
|
||||
system('git', 'update-ref', 'HEAD', "$orig_branch");
|
||||
unless ($opt_i) {
|
||||
system('git checkout');
|
||||
die "checkout failed: $?\n" if $?;
|
||||
|
||||
@@ -114,9 +114,9 @@ due to SVN memory leaks. (These have been worked around.)
|
||||
-R <repack_each_revs>::
|
||||
Specify how often git repository should be repacked.
|
||||
+
|
||||
The default value is 1000. git-svnimport will do import in chunks of 1000
|
||||
revisions, after each chunk git repository will be repacked. To disable
|
||||
this behavior specify some big value here which is mote than number of
|
||||
The default value is 1000. git-svnimport will do imports in chunks of 1000
|
||||
revisions, after each chunk the git repository will be repacked. To disable
|
||||
this behavior specify some large value here which is greater than the number of
|
||||
revisions to import.
|
||||
|
||||
-P <path_from_trunk>::
|
||||
|
||||
@@ -442,13 +442,14 @@ def p4ChangesForPaths(depotPaths, changeRange):
|
||||
output = p4_read_pipe_lines("changes " + ' '.join (["%s...%s" % (p, changeRange)
|
||||
for p in depotPaths]))
|
||||
|
||||
changes = []
|
||||
changes = {}
|
||||
for line in output:
|
||||
changeNum = line.split(" ")[1]
|
||||
changes.append(int(changeNum))
|
||||
changeNum = int(line.split(" ")[1])
|
||||
changes[changeNum] = True
|
||||
|
||||
changes.sort()
|
||||
return changes
|
||||
changelist = changes.keys()
|
||||
changelist.sort()
|
||||
return changelist
|
||||
|
||||
class Command:
|
||||
def __init__(self):
|
||||
|
||||
7
date.c
7
date.c
@@ -89,6 +89,11 @@ const char *show_date(unsigned long time, int tz, enum date_mode mode)
|
||||
struct tm *tm;
|
||||
static char timebuf[200];
|
||||
|
||||
if (mode == DATE_RAW) {
|
||||
snprintf(timebuf, sizeof(timebuf), "%lu %+05d", time, tz);
|
||||
return timebuf;
|
||||
}
|
||||
|
||||
if (mode == DATE_RELATIVE) {
|
||||
unsigned long diff;
|
||||
struct timeval now;
|
||||
@@ -615,6 +620,8 @@ enum date_mode parse_date_format(const char *format)
|
||||
return DATE_LOCAL;
|
||||
else if (!strcmp(format, "default"))
|
||||
return DATE_NORMAL;
|
||||
else if (!strcmp(format, "raw"))
|
||||
return DATE_RAW;
|
||||
else
|
||||
die("unknown date format %s", format);
|
||||
}
|
||||
|
||||
@@ -247,6 +247,7 @@ void diff_no_index(struct rev_info *revs,
|
||||
else
|
||||
revs->diffopt.paths = argv + argc - 2;
|
||||
revs->diffopt.nr_paths = 2;
|
||||
revs->diffopt.skip_stat_unmatch = 1;
|
||||
|
||||
DIFF_OPT_SET(&revs->diffopt, EXIT_WITH_STATUS);
|
||||
DIFF_OPT_SET(&revs->diffopt, NO_INDEX);
|
||||
|
||||
33
exec_cmd.c
33
exec_cmd.c
@@ -23,35 +23,10 @@ const char *system_path(const char *path)
|
||||
assert(argv0_path);
|
||||
assert(is_absolute_path(argv0_path));
|
||||
|
||||
if (!prefix) {
|
||||
const char *strip[] = {
|
||||
GIT_EXEC_PATH,
|
||||
BINDIR,
|
||||
0
|
||||
};
|
||||
const char **s;
|
||||
|
||||
for (s = strip; *s; s++) {
|
||||
const char *sargv = argv0_path + strlen(argv0_path);
|
||||
const char *ss = *s + strlen(*s);
|
||||
while (argv0_path < sargv && *s < ss
|
||||
&& (*sargv == *ss ||
|
||||
(is_dir_sep(*sargv) && is_dir_sep(*ss)))) {
|
||||
sargv--;
|
||||
ss--;
|
||||
}
|
||||
if (*s == ss) {
|
||||
struct strbuf d = STRBUF_INIT;
|
||||
/* We also skip the trailing directory separator. */
|
||||
assert(sargv - argv0_path - 1 >= 0);
|
||||
strbuf_add(&d, argv0_path, sargv - argv0_path - 1);
|
||||
prefix = strbuf_detach(&d, NULL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!prefix) {
|
||||
if (!prefix &&
|
||||
!(prefix = strip_path_suffix(argv0_path, GIT_EXEC_PATH)) &&
|
||||
!(prefix = strip_path_suffix(argv0_path, BINDIR)) &&
|
||||
!(prefix = strip_path_suffix(argv0_path, "git"))) {
|
||||
prefix = PREFIX;
|
||||
fprintf(stderr, "RUNTIME_PREFIX requested, "
|
||||
"but prefix computation failed. "
|
||||
|
||||
@@ -817,9 +817,8 @@ static void start_packfile(void)
|
||||
struct pack_header hdr;
|
||||
int pack_fd;
|
||||
|
||||
snprintf(tmpfile, sizeof(tmpfile),
|
||||
"%s/pack/tmp_pack_XXXXXX", get_object_directory());
|
||||
pack_fd = xmkstemp(tmpfile);
|
||||
pack_fd = odb_mkstemp(tmpfile, sizeof(tmpfile),
|
||||
"pack/tmp_pack_XXXXXX");
|
||||
p = xcalloc(1, sizeof(*p) + strlen(tmpfile) + 2);
|
||||
strcpy(p->pack_name, tmpfile);
|
||||
p->pack_fd = pack_fd;
|
||||
@@ -879,9 +878,8 @@ static char *create_index(void)
|
||||
c = next;
|
||||
}
|
||||
|
||||
snprintf(tmpfile, sizeof(tmpfile),
|
||||
"%s/pack/tmp_idx_XXXXXX", get_object_directory());
|
||||
idx_fd = xmkstemp(tmpfile);
|
||||
idx_fd = odb_mkstemp(tmpfile, sizeof(tmpfile),
|
||||
"pack/tmp_idx_XXXXXX");
|
||||
f = sha1fd(idx_fd, tmpfile);
|
||||
sha1write(f, array, 256 * sizeof(int));
|
||||
git_SHA1_Init(&ctx);
|
||||
@@ -907,9 +905,7 @@ static char *keep_pack(char *curr_index_name)
|
||||
chmod(pack_data->pack_name, 0444);
|
||||
chmod(curr_index_name, 0444);
|
||||
|
||||
snprintf(name, sizeof(name), "%s/pack/pack-%s.keep",
|
||||
get_object_directory(), sha1_to_hex(pack_data->sha1));
|
||||
keep_fd = open(name, O_RDWR|O_CREAT|O_EXCL, 0600);
|
||||
keep_fd = odb_pack_keep(name, sizeof(name), pack_data->sha1);
|
||||
if (keep_fd < 0)
|
||||
die("cannot create keep file");
|
||||
write_or_die(keep_fd, keep_msg, strlen(keep_msg));
|
||||
|
||||
@@ -303,6 +303,8 @@ extern ssize_t xwrite(int fd, const void *buf, size_t len);
|
||||
extern int xdup(int fd);
|
||||
extern FILE *xfdopen(int fd, const char *mode);
|
||||
extern int xmkstemp(char *template);
|
||||
extern int odb_mkstemp(char *template, size_t limit, const char *pattern);
|
||||
extern int odb_pack_keep(char *name, size_t namesz, unsigned char *sha1);
|
||||
|
||||
static inline size_t xsize_t(off_t len)
|
||||
{
|
||||
|
||||
@@ -220,6 +220,12 @@ die ""
|
||||
# Remove tempdir on exit
|
||||
trap 'cd ../..; rm -rf "$tempdir"' 0
|
||||
|
||||
ORIG_GIT_DIR="$GIT_DIR"
|
||||
ORIG_GIT_WORK_TREE="$GIT_WORK_TREE"
|
||||
ORIG_GIT_INDEX_FILE="$GIT_INDEX_FILE"
|
||||
GIT_WORK_TREE=.
|
||||
export GIT_DIR GIT_WORK_TREE
|
||||
|
||||
# Make sure refs/original is empty
|
||||
git for-each-ref > "$tempdir"/backup-refs || exit
|
||||
while read sha1 type name
|
||||
@@ -234,12 +240,6 @@ do
|
||||
esac
|
||||
done < "$tempdir"/backup-refs
|
||||
|
||||
ORIG_GIT_DIR="$GIT_DIR"
|
||||
ORIG_GIT_WORK_TREE="$GIT_WORK_TREE"
|
||||
ORIG_GIT_INDEX_FILE="$GIT_INDEX_FILE"
|
||||
GIT_WORK_TREE=.
|
||||
export GIT_DIR GIT_WORK_TREE
|
||||
|
||||
# The refs should be updated if their heads were rewritten
|
||||
git rev-parse --no-flags --revs-only --symbolic-full-name \
|
||||
--default HEAD "$@" > "$tempdir"/raw-heads || exit
|
||||
|
||||
@@ -171,6 +171,11 @@ case "$merge_head" in
|
||||
echo >&2 "Cannot merge multiple branches into empty head"
|
||||
exit 1
|
||||
fi
|
||||
if test true = "$rebase"
|
||||
then
|
||||
echo >&2 "Cannot rebase onto multiple branches"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ tmp_info="$tmp_dir/info"
|
||||
commit=$(git rev-parse HEAD)
|
||||
|
||||
mkdir $tmp_dir || exit 2
|
||||
while read patch_name level garbage
|
||||
while read patch_name level garbage <&3
|
||||
do
|
||||
case "$patch_name" in ''|'#'*) continue;; esac
|
||||
case "$level" in
|
||||
@@ -134,5 +134,5 @@ do
|
||||
commit=$( (echo "$SUBJECT"; echo; cat "$tmp_msg") | git commit-tree $tree -p $commit) &&
|
||||
git update-ref -m "quiltimport: $patch_name" HEAD $commit || exit 4
|
||||
fi
|
||||
done <"$QUILT_PATCHES/series"
|
||||
done 3<"$QUILT_PATCHES/series"
|
||||
rm -rf $tmp_dir || exit 5
|
||||
|
||||
@@ -310,6 +310,7 @@ do
|
||||
esac
|
||||
shift
|
||||
done
|
||||
test $# -gt 2 && usage
|
||||
|
||||
# Make sure we do not have $GIT_DIR/rebase-apply
|
||||
if test -z "$do_merge"
|
||||
|
||||
29
git-svn.perl
29
git-svn.perl
@@ -438,7 +438,17 @@ sub cmd_dcommit {
|
||||
die "Unable to determine upstream SVN information from ",
|
||||
"$head history.\nPerhaps the repository is empty.";
|
||||
}
|
||||
$url = defined $_commit_url ? $_commit_url : $gs->full_url;
|
||||
|
||||
if (defined $_commit_url) {
|
||||
$url = $_commit_url;
|
||||
} else {
|
||||
$url = eval { command_oneline('config', '--get',
|
||||
"svn-remote.$gs->{repo_id}.commiturl") };
|
||||
if (!$url) {
|
||||
$url = $gs->full_url
|
||||
}
|
||||
}
|
||||
|
||||
my $last_rev = $_revision if defined $_revision;
|
||||
if ($url) {
|
||||
print "Committing to $url ...\n";
|
||||
@@ -670,7 +680,11 @@ sub cmd_create_ignore {
|
||||
$gs->prop_walk($gs->{path}, $r, sub {
|
||||
my ($gs, $path, $props) = @_;
|
||||
# $path is of the form /path/to/dir/
|
||||
my $ignore = '.' . $path . '.gitignore';
|
||||
$path = '.' . $path;
|
||||
# SVN can have attributes on empty directories,
|
||||
# which git won't track
|
||||
mkpath([$path]) unless -d $path;
|
||||
my $ignore = $path . '.gitignore';
|
||||
my $s = $props->{'svn:ignore'} or return;
|
||||
open(GITIGNORE, '>', $ignore)
|
||||
or fatal("Failed to open `$ignore' for writing: $!");
|
||||
@@ -2417,6 +2431,7 @@ sub find_parent_branch {
|
||||
# do_switch works with svn/trunk >= r22312, but that
|
||||
# is not included with SVN 1.4.3 (the latest version
|
||||
# at the moment), so we can't rely on it
|
||||
$self->{last_rev} = $r0;
|
||||
$self->{last_commit} = $parent;
|
||||
$ed = SVN::Git::Fetcher->new($self, $gs->{path});
|
||||
$gs->ra->gs_do_switch($r0, $rev, $gs,
|
||||
@@ -2526,7 +2541,7 @@ sub get_untracked {
|
||||
sub parse_svn_date {
|
||||
my $date = shift || return '+0000 1970-01-01 00:00:00';
|
||||
my ($Y,$m,$d,$H,$M,$S) = ($date =~ /^(\d{4})\-(\d\d)\-(\d\d)T
|
||||
(\d\d)\:(\d\d)\:(\d\d).\d+Z$/x) or
|
||||
(\d\d)\:(\d\d)\:(\d\d)\.\d*Z$/x) or
|
||||
croak "Unable to parse date: $date\n";
|
||||
my $parsed_date; # Set next.
|
||||
|
||||
@@ -4615,6 +4630,7 @@ package Git::SVN::Log;
|
||||
use strict;
|
||||
use warnings;
|
||||
use POSIX qw/strftime/;
|
||||
use Time::Local;
|
||||
use constant commit_log_separator => ('-' x 72) . "\n";
|
||||
use vars qw/$TZ $limit $color $pager $non_recursive $verbose $oneline
|
||||
%rusers $show_commit $incremental/;
|
||||
@@ -4721,7 +4737,12 @@ sub run_pager {
|
||||
}
|
||||
|
||||
sub format_svn_date {
|
||||
return strftime("%Y-%m-%d %H:%M:%S %z (%a, %d %b %Y)", localtime(shift));
|
||||
# some systmes don't handle or mishandle %z, so be creative.
|
||||
my $t = shift;
|
||||
my $gm = timelocal(gmtime($t));
|
||||
my $sign = qw( + + - )[ $t <=> $gm ];
|
||||
my $gmoff = sprintf("%s%02d%02d", $sign, (gmtime(abs($t - $gm)))[2,1]);
|
||||
return strftime("%Y-%m-%d %H:%M:%S $gmoff (%a, %d %b %Y)", localtime($t));
|
||||
}
|
||||
|
||||
sub parse_git_date {
|
||||
|
||||
@@ -402,13 +402,13 @@ sub feature_bool {
|
||||
my $key = shift;
|
||||
my ($val) = git_get_project_config($key, '--bool');
|
||||
|
||||
if ($val eq 'true') {
|
||||
if (!defined $val) {
|
||||
return ($_[0]);
|
||||
} elsif ($val eq 'true') {
|
||||
return (1);
|
||||
} elsif ($val eq 'false') {
|
||||
return (0);
|
||||
}
|
||||
|
||||
return ($_[0]);
|
||||
}
|
||||
|
||||
sub feature_snapshot {
|
||||
@@ -1384,13 +1384,11 @@ sub format_log_line_html {
|
||||
my $line = shift;
|
||||
|
||||
$line = esc_html($line, -nbsp=>1);
|
||||
if ($line =~ m/\b([0-9a-fA-F]{8,40})\b/) {
|
||||
my $hash_text = $1;
|
||||
my $link =
|
||||
$cgi->a({-href => href(action=>"object", hash=>$hash_text),
|
||||
-class => "text"}, $hash_text);
|
||||
$line =~ s/$hash_text/$link/;
|
||||
}
|
||||
$line =~ s{\b([0-9a-fA-F]{8,40})\b}{
|
||||
$cgi->a({-href => href(action=>"object", hash=>$1),
|
||||
-class => "text"}, $1);
|
||||
}eg;
|
||||
|
||||
return $line;
|
||||
}
|
||||
|
||||
@@ -1914,18 +1912,19 @@ sub git_parse_project_config {
|
||||
return %config;
|
||||
}
|
||||
|
||||
# convert config value to boolean, 'true' or 'false'
|
||||
# convert config value to boolean: 'true' or 'false'
|
||||
# no value, number > 0, 'true' and 'yes' values are true
|
||||
# rest of values are treated as false (never as error)
|
||||
sub config_to_bool {
|
||||
my $val = shift;
|
||||
|
||||
return 1 if !defined $val; # section.key
|
||||
|
||||
# strip leading and trailing whitespace
|
||||
$val =~ s/^\s+//;
|
||||
$val =~ s/\s+$//;
|
||||
|
||||
return (!defined $val || # section.key
|
||||
($val =~ /^\d+$/ && $val) || # section.key = 1
|
||||
return (($val =~ /^\d+$/ && $val) || # section.key = 1
|
||||
($val =~ /^(?:true|yes)$/i)); # section.key = true
|
||||
}
|
||||
|
||||
@@ -1978,6 +1977,9 @@ sub git_get_project_config {
|
||||
$config_file = "$git_dir/config";
|
||||
}
|
||||
|
||||
# check if config variable (key) exists
|
||||
return unless exists $config{"gitweb.$key"};
|
||||
|
||||
# ensure given type
|
||||
if (!defined $type) {
|
||||
return $config{"gitweb.$key"};
|
||||
|
||||
23
index-pack.c
23
index-pack.c
@@ -172,9 +172,8 @@ static char *open_pack_file(char *pack_name)
|
||||
input_fd = 0;
|
||||
if (!pack_name) {
|
||||
static char tmpfile[PATH_MAX];
|
||||
snprintf(tmpfile, sizeof(tmpfile),
|
||||
"%s/pack/tmp_pack_XXXXXX", get_object_directory());
|
||||
output_fd = xmkstemp(tmpfile);
|
||||
output_fd = odb_mkstemp(tmpfile, sizeof(tmpfile),
|
||||
"pack/tmp_pack_XXXXXX");
|
||||
pack_name = xstrdup(tmpfile);
|
||||
} else
|
||||
output_fd = open(pack_name, O_CREAT|O_EXCL|O_RDWR, 0600);
|
||||
@@ -794,22 +793,24 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
|
||||
|
||||
if (keep_msg) {
|
||||
int keep_fd, keep_msg_len = strlen(keep_msg);
|
||||
if (!keep_name) {
|
||||
snprintf(name, sizeof(name), "%s/pack/pack-%s.keep",
|
||||
get_object_directory(), sha1_to_hex(sha1));
|
||||
keep_name = name;
|
||||
}
|
||||
keep_fd = open(keep_name, O_RDWR|O_CREAT|O_EXCL, 0600);
|
||||
|
||||
if (!keep_name)
|
||||
keep_fd = odb_pack_keep(name, sizeof(name), sha1);
|
||||
else
|
||||
keep_fd = open(keep_name, O_RDWR|O_CREAT|O_EXCL, 0600);
|
||||
|
||||
if (keep_fd < 0) {
|
||||
if (errno != EEXIST)
|
||||
die("cannot write keep file");
|
||||
die("cannot write keep file '%s' (%s)",
|
||||
keep_name, strerror(errno));
|
||||
} else {
|
||||
if (keep_msg_len > 0) {
|
||||
write_or_die(keep_fd, keep_msg, keep_msg_len);
|
||||
write_or_die(keep_fd, "\n", 1);
|
||||
}
|
||||
if (close(keep_fd) != 0)
|
||||
die("cannot write keep file");
|
||||
die("cannot close written keep file '%s' (%s)",
|
||||
keep_name, strerror(errno));
|
||||
report = "keep";
|
||||
}
|
||||
}
|
||||
|
||||
16
lockfile.c
16
lockfile.c
@@ -155,11 +155,25 @@ static int lock_file(struct lock_file *lk, const char *path, int flags)
|
||||
return lk->fd;
|
||||
}
|
||||
|
||||
|
||||
NORETURN void unable_to_lock_index_die(const char *path, int err)
|
||||
{
|
||||
if (errno == EEXIST) {
|
||||
die("Unable to create '%s.lock': %s.\n\n"
|
||||
"If no other git process is currently running, this probably means a\n"
|
||||
"git process crashed in this repository earlier. Make sure no other git\n"
|
||||
"process is running and remove the file manually to continue.",
|
||||
path, strerror(err));
|
||||
} else {
|
||||
die("Unable to create '%s.lock': %s", path, strerror(err));
|
||||
}
|
||||
}
|
||||
|
||||
int hold_lock_file_for_update(struct lock_file *lk, const char *path, int flags)
|
||||
{
|
||||
int fd = lock_file(lk, path, flags);
|
||||
if (fd < 0 && (flags & LOCK_DIE_ON_ERROR))
|
||||
die("unable to create '%s.lock': %s", path, strerror(errno));
|
||||
unable_to_lock_index_die(path, errno);
|
||||
return fd;
|
||||
}
|
||||
|
||||
|
||||
@@ -44,9 +44,7 @@ char *write_idx_file(char *index_name, struct pack_idx_entry **objects,
|
||||
|
||||
if (!index_name) {
|
||||
static char tmpfile[PATH_MAX];
|
||||
snprintf(tmpfile, sizeof(tmpfile),
|
||||
"%s/pack/tmp_idx_XXXXXX", get_object_directory());
|
||||
fd = xmkstemp(tmpfile);
|
||||
fd = odb_mkstemp(tmpfile, sizeof(tmpfile), "pack/tmp_idx_XXXXXX");
|
||||
index_name = xstrdup(tmpfile);
|
||||
} else {
|
||||
unlink(index_name);
|
||||
@@ -239,7 +237,7 @@ char *index_pack_lockfile(int ip_out)
|
||||
char packname[46];
|
||||
|
||||
/*
|
||||
* The first thing we expects from index-pack's output
|
||||
* The first thing we expect from index-pack's output
|
||||
* is "pack\t%40s\n" or "keep\t%40s\n" (46 bytes) where
|
||||
* %40s is the newly created pack SHA1 name. In the "keep"
|
||||
* case, we need it to remove the corresponding .keep file
|
||||
|
||||
36
path.c
36
path.c
@@ -499,3 +499,39 @@ int longest_ancestor_length(const char *path, const char *prefix_list)
|
||||
|
||||
return max_len;
|
||||
}
|
||||
|
||||
/* strip arbitrary amount of directory separators at end of path */
|
||||
static inline int chomp_trailing_dir_sep(const char *path, int len)
|
||||
{
|
||||
while (len && is_dir_sep(path[len - 1]))
|
||||
len--;
|
||||
return len;
|
||||
}
|
||||
|
||||
/*
|
||||
* If path ends with suffix (complete path components), returns the
|
||||
* part before suffix (sans trailing directory separators).
|
||||
* Otherwise returns NULL.
|
||||
*/
|
||||
char *strip_path_suffix(const char *path, const char *suffix)
|
||||
{
|
||||
int path_len = strlen(path), suffix_len = strlen(suffix);
|
||||
|
||||
while (suffix_len) {
|
||||
if (!path_len)
|
||||
return NULL;
|
||||
|
||||
if (is_dir_sep(path[path_len - 1])) {
|
||||
if (!is_dir_sep(suffix[suffix_len - 1]))
|
||||
return NULL;
|
||||
path_len = chomp_trailing_dir_sep(path, path_len);
|
||||
suffix_len = chomp_trailing_dir_sep(suffix, suffix_len);
|
||||
}
|
||||
else if (path[--path_len] != suffix[--suffix_len])
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (path_len && !is_dir_sep(path[path_len - 1]))
|
||||
return NULL;
|
||||
return xstrndup(path, chomp_trailing_dir_sep(path, path_len));
|
||||
}
|
||||
|
||||
@@ -801,7 +801,7 @@ unsigned char* use_pack(struct packed_git *p,
|
||||
if (p->pack_fd == -1 && open_packed_git(p))
|
||||
die("packfile %s cannot be accessed", p->pack_name);
|
||||
|
||||
/* Since packfiles end in a hash of their content and its
|
||||
/* Since packfiles end in a hash of their content and it's
|
||||
* pointless to ask for an offset into the middle of that
|
||||
* hash, and the in_window function above wouldn't match
|
||||
* don't allow an offset too close to the end of the file.
|
||||
|
||||
@@ -11,7 +11,21 @@ then
|
||||
exit
|
||||
fi
|
||||
|
||||
LIB_HTTPD_PATH=${LIB_HTTPD_PATH-'/usr/sbin/apache2'}
|
||||
HTTPD_PARA=""
|
||||
|
||||
case $(uname) in
|
||||
Darwin)
|
||||
DEFAULT_HTTPD_PATH='/usr/sbin/httpd'
|
||||
DEFAULT_HTTPD_MODULE_PATH='/usr/libexec/apache2'
|
||||
HTTPD_PARA="$HTTPD_PARA -DDarwin"
|
||||
;;
|
||||
*)
|
||||
DEFAULT_HTTPD_PATH='/usr/sbin/apache2'
|
||||
DEFAULT_HTTPD_MODULE_PATH='/usr/lib/apache2/modules'
|
||||
;;
|
||||
esac
|
||||
|
||||
LIB_HTTPD_PATH=${LIB_HTTPD_PATH-"$DEFAULT_HTTPD_PATH"}
|
||||
LIB_HTTPD_PORT=${LIB_HTTPD_PORT-'8111'}
|
||||
|
||||
TEST_PATH="$TEST_DIRECTORY"/lib-httpd
|
||||
@@ -39,14 +53,12 @@ then
|
||||
exit
|
||||
fi
|
||||
|
||||
LIB_HTTPD_MODULE_PATH='/usr/lib/apache2/modules'
|
||||
LIB_HTTPD_MODULE_PATH="$DEFAULT_HTTPD_MODULE_PATH"
|
||||
fi
|
||||
else
|
||||
error "Could not identify web server at '$LIB_HTTPD_PATH'"
|
||||
fi
|
||||
|
||||
HTTPD_PARA=""
|
||||
|
||||
prepare_httpd() {
|
||||
mkdir -p "$HTTPD_DOCUMENT_ROOT_PATH"
|
||||
|
||||
@@ -95,5 +107,5 @@ stop_httpd() {
|
||||
trap 'die' EXIT
|
||||
|
||||
"$LIB_HTTPD_PATH" -d "$HTTPD_ROOT_PATH" \
|
||||
-f "$TEST_PATH/apache.conf" -k stop
|
||||
-f "$TEST_PATH/apache.conf" $HTTPD_PARA -k stop
|
||||
}
|
||||
|
||||
@@ -5,6 +5,12 @@ LogFormat "%h %l %u %t \"%r\" %>s %b" common
|
||||
CustomLog access.log common
|
||||
ErrorLog error.log
|
||||
|
||||
<IfDefine Darwin>
|
||||
LoadModule log_config_module modules/mod_log_config.so
|
||||
LockFile accept.lock
|
||||
PidFile httpd.pid
|
||||
</IfDefine>
|
||||
|
||||
<IfDefine SSL>
|
||||
LoadModule ssl_module modules/mod_ssl.so
|
||||
|
||||
|
||||
@@ -85,4 +85,8 @@ ancestor /foo/bar :://foo/.:: 4
|
||||
ancestor /foo/bar //foo/./::/bar 4
|
||||
ancestor /foo/bar ::/bar -1
|
||||
|
||||
test_expect_success 'strip_path_suffix' '
|
||||
test c:/msysgit = $(test-path-utils strip_path_suffix \
|
||||
c:/msysgit/libexec//git-core libexec/git-core)
|
||||
'
|
||||
test_done
|
||||
|
||||
@@ -74,6 +74,10 @@ test_expect_success setup '
|
||||
for i in 1 2; do echo $i; done >>dir/sub &&
|
||||
git update-index file0 dir/sub &&
|
||||
|
||||
mkdir dir3 &&
|
||||
cp dir/sub dir3/sub &&
|
||||
test-chmtime +1 dir3/sub &&
|
||||
|
||||
git config log.showroot false &&
|
||||
git commit --amend &&
|
||||
git show-branch
|
||||
@@ -262,6 +266,7 @@ diff --patch-with-raw -r initial..side
|
||||
diff --name-status dir2 dir
|
||||
diff --no-index --name-status dir2 dir
|
||||
diff --no-index --name-status -- dir2 dir
|
||||
diff --no-index dir dir3
|
||||
diff master master^ side
|
||||
EOF
|
||||
|
||||
|
||||
2
t/t4013/diff.diff_--no-index_dir_dir3
Normal file
2
t/t4013/diff.diff_--no-index_dir_dir3
Normal file
@@ -0,0 +1,2 @@
|
||||
$ git diff --no-index dir dir3
|
||||
$
|
||||
@@ -196,6 +196,23 @@ test_expect_success \
|
||||
|
||||
unset GIT_OBJECT_DIRECTORY
|
||||
|
||||
test_expect_success 'survive missing objects/pack directory' '
|
||||
(
|
||||
rm -fr missing-pack &&
|
||||
mkdir missing-pack &&
|
||||
cd missing-pack &&
|
||||
git init &&
|
||||
GOP=.git/objects/pack
|
||||
rm -fr $GOP &&
|
||||
git index-pack --stdin --keep=test <../test-3-${packname_3}.pack &&
|
||||
test -f $GOP/pack-${packname_3}.pack &&
|
||||
test_cmp $GOP/pack-${packname_3}.pack ../test-3-${packname_3}.pack &&
|
||||
test -f $GOP/pack-${packname_3}.idx &&
|
||||
test_cmp $GOP/pack-${packname_3}.idx ../test-3-${packname_3}.idx &&
|
||||
test -f $GOP/pack-${packname_3}.keep
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success \
|
||||
'verify pack' \
|
||||
'git verify-pack test-1-${packname_1}.idx \
|
||||
|
||||
@@ -48,6 +48,18 @@ test_expect_success 'result is really identical' '
|
||||
test $H = $(git rev-parse HEAD)
|
||||
'
|
||||
|
||||
TRASHDIR=$(pwd)
|
||||
test_expect_success 'correct GIT_DIR while using -d' '
|
||||
mkdir drepo &&
|
||||
( cd drepo &&
|
||||
git init &&
|
||||
test_commit drepo &&
|
||||
git filter-branch -d "$TRASHDIR/dfoo" \
|
||||
--index-filter "cp \"$TRASHDIR\"/dfoo/backup-refs \"$TRASHDIR\"" \
|
||||
) &&
|
||||
grep drepo "$TRASHDIR/backup-refs"
|
||||
'
|
||||
|
||||
test_expect_success 'Fail if commit filter fails' '
|
||||
test_must_fail git filter-branch -f --commit-filter "exit 1" HEAD
|
||||
'
|
||||
|
||||
12
t/t9136-git-svn-recreated-branch-empty-file.sh
Executable file
12
t/t9136-git-svn-recreated-branch-empty-file.sh
Executable file
@@ -0,0 +1,12 @@
|
||||
#!/bin/sh
|
||||
|
||||
test_description='test recreated svn branch with empty files'
|
||||
|
||||
. ./lib-git-svn.sh
|
||||
test_expect_success 'load svn dumpfile' '
|
||||
svnadmin load "$rawsvnrepo" < "${TEST_DIRECTORY}/t9136/svn.dump"
|
||||
'
|
||||
|
||||
test_expect_success 'clone using git svn' 'git svn clone -s "$svnrepo" x'
|
||||
|
||||
test_done
|
||||
192
t/t9136/svn.dump
Normal file
192
t/t9136/svn.dump
Normal file
@@ -0,0 +1,192 @@
|
||||
SVN-fs-dump-format-version: 2
|
||||
|
||||
UUID: eecae021-8f16-48da-969d-79beb8ae6ea5
|
||||
|
||||
Revision-number: 0
|
||||
Prop-content-length: 56
|
||||
Content-length: 56
|
||||
|
||||
K 8
|
||||
svn:date
|
||||
V 27
|
||||
2009-02-22T00:50:56.292890Z
|
||||
PROPS-END
|
||||
|
||||
Revision-number: 1
|
||||
Prop-content-length: 106
|
||||
Content-length: 106
|
||||
|
||||
K 7
|
||||
svn:log
|
||||
V 4
|
||||
init
|
||||
K 10
|
||||
svn:author
|
||||
V 8
|
||||
john.doe
|
||||
K 8
|
||||
svn:date
|
||||
V 27
|
||||
2009-02-22T00:50:57.192384Z
|
||||
PROPS-END
|
||||
|
||||
Node-path: branches
|
||||
Node-kind: dir
|
||||
Node-action: add
|
||||
Prop-content-length: 10
|
||||
Content-length: 10
|
||||
|
||||
PROPS-END
|
||||
|
||||
|
||||
Node-path: tags
|
||||
Node-kind: dir
|
||||
Node-action: add
|
||||
Prop-content-length: 10
|
||||
Content-length: 10
|
||||
|
||||
PROPS-END
|
||||
|
||||
|
||||
Node-path: trunk
|
||||
Node-kind: dir
|
||||
Node-action: add
|
||||
Prop-content-length: 10
|
||||
Content-length: 10
|
||||
|
||||
PROPS-END
|
||||
|
||||
|
||||
Node-path: trunk/file
|
||||
Node-kind: file
|
||||
Node-action: add
|
||||
Prop-content-length: 10
|
||||
Text-content-length: 0
|
||||
Text-content-md5: d41d8cd98f00b204e9800998ecf8427e
|
||||
Content-length: 10
|
||||
|
||||
PROPS-END
|
||||
|
||||
|
||||
Revision-number: 2
|
||||
Prop-content-length: 105
|
||||
Content-length: 105
|
||||
|
||||
K 7
|
||||
svn:log
|
||||
V 3
|
||||
1.0
|
||||
K 10
|
||||
svn:author
|
||||
V 8
|
||||
john.doe
|
||||
K 8
|
||||
svn:date
|
||||
V 27
|
||||
2009-02-22T00:50:58.124724Z
|
||||
PROPS-END
|
||||
|
||||
Node-path: tags/1.0
|
||||
Node-kind: dir
|
||||
Node-action: add
|
||||
Node-copyfrom-rev: 1
|
||||
Node-copyfrom-path: trunk
|
||||
|
||||
|
||||
Revision-number: 3
|
||||
Prop-content-length: 111
|
||||
Content-length: 111
|
||||
|
||||
K 7
|
||||
svn:log
|
||||
V 9
|
||||
1.0.1-bad
|
||||
K 10
|
||||
svn:author
|
||||
V 8
|
||||
john.doe
|
||||
K 8
|
||||
svn:date
|
||||
V 27
|
||||
2009-02-22T00:50:58.151727Z
|
||||
PROPS-END
|
||||
|
||||
Node-path: tags/1.0.1
|
||||
Node-kind: dir
|
||||
Node-action: add
|
||||
Node-copyfrom-rev: 2
|
||||
Node-copyfrom-path: tags/1.0
|
||||
|
||||
|
||||
Revision-number: 4
|
||||
Prop-content-length: 111
|
||||
Content-length: 111
|
||||
|
||||
K 7
|
||||
svn:log
|
||||
V 9
|
||||
Wrong tag
|
||||
K 10
|
||||
svn:author
|
||||
V 8
|
||||
john.doe
|
||||
K 8
|
||||
svn:date
|
||||
V 27
|
||||
2009-02-22T00:50:58.167427Z
|
||||
PROPS-END
|
||||
|
||||
Node-path: tags/1.0.1
|
||||
Node-action: delete
|
||||
|
||||
|
||||
Revision-number: 5
|
||||
Prop-content-length: 113
|
||||
Content-length: 113
|
||||
|
||||
K 7
|
||||
svn:log
|
||||
V 10
|
||||
1.0-branch
|
||||
K 10
|
||||
svn:author
|
||||
V 8
|
||||
john.doe
|
||||
K 8
|
||||
svn:date
|
||||
V 27
|
||||
2009-02-22T00:50:58.184498Z
|
||||
PROPS-END
|
||||
|
||||
Node-path: branches/1.0
|
||||
Node-kind: dir
|
||||
Node-action: add
|
||||
Node-copyfrom-rev: 4
|
||||
Node-copyfrom-path: tags/1.0
|
||||
|
||||
|
||||
Revision-number: 6
|
||||
Prop-content-length: 113
|
||||
Content-length: 113
|
||||
|
||||
K 7
|
||||
svn:log
|
||||
V 10
|
||||
1.0.1-good
|
||||
K 10
|
||||
svn:author
|
||||
V 8
|
||||
john.doe
|
||||
K 8
|
||||
svn:date
|
||||
V 27
|
||||
2009-02-22T00:50:58.200695Z
|
||||
PROPS-END
|
||||
|
||||
Node-path: tags/1.0.1
|
||||
Node-kind: dir
|
||||
Node-action: add
|
||||
Node-copyfrom-rev: 5
|
||||
Node-copyfrom-path: branches/1.0
|
||||
|
||||
|
||||
@@ -185,8 +185,8 @@ test_expect_success 'submodule fast-export | fast-import' '
|
||||
|
||||
'
|
||||
|
||||
export GIT_AUTHOR_NAME='A U Thor'
|
||||
export GIT_COMMITTER_NAME='C O Mitter'
|
||||
GIT_AUTHOR_NAME='A U Thor'; export GIT_AUTHOR_NAME
|
||||
GIT_COMMITTER_NAME='C O Mitter'; export GIT_COMMITTER_NAME
|
||||
|
||||
test_expect_success 'setup copies' '
|
||||
|
||||
|
||||
@@ -661,6 +661,11 @@ cat >>gitweb_config.perl <<EOF
|
||||
\$feature{'snapshot'}{'override'} = 1;
|
||||
EOF
|
||||
|
||||
test_expect_success \
|
||||
'config override: tree view, features not overridden in repo config' \
|
||||
'gitweb_run "p=.git;a=tree"'
|
||||
test_debug 'cat gitweb.log'
|
||||
|
||||
test_expect_success \
|
||||
'config override: tree view, features disabled in repo config' \
|
||||
'git config gitweb.blame no &&
|
||||
@@ -669,12 +674,23 @@ test_expect_success \
|
||||
test_debug 'cat gitweb.log'
|
||||
|
||||
test_expect_success \
|
||||
'config override: tree view, features enabled in repo config' \
|
||||
'config override: tree view, features enabled in repo config (1)' \
|
||||
'git config gitweb.blame yes &&
|
||||
git config gitweb.snapshot "zip,tgz, tbz2" &&
|
||||
gitweb_run "p=.git;a=tree"'
|
||||
test_debug 'cat gitweb.log'
|
||||
|
||||
cat >.git/config <<\EOF
|
||||
# testing noval and alternate separator
|
||||
[gitweb]
|
||||
blame
|
||||
snapshot = zip tgz
|
||||
EOF
|
||||
test_expect_success \
|
||||
'config override: tree view, features enabled in repo config (2)' \
|
||||
'gitweb_run "p=.git;a=tree"'
|
||||
test_debug 'cat gitweb.log'
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# non-ASCII in README.html
|
||||
|
||||
|
||||
@@ -82,7 +82,7 @@ do
|
||||
-i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate)
|
||||
immediate=t; shift ;;
|
||||
-l|--l|--lo|--lon|--long|--long-|--long-t|--long-te|--long-tes|--long-test|--long-tests)
|
||||
export GIT_TEST_LONG=t; shift ;;
|
||||
GIT_TEST_LONG=t; export GIT_TEST_LONG; shift ;;
|
||||
-h|--h|--he|--hel|--help)
|
||||
help=t; shift ;;
|
||||
-v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
|
||||
|
||||
@@ -26,6 +26,12 @@ int main(int argc, char **argv)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (argc == 4 && !strcmp(argv[1], "strip_path_suffix")) {
|
||||
char *prefix = strip_path_suffix(argv[2], argv[3]);
|
||||
printf("%s\n", prefix ? prefix : "(null)");
|
||||
return 0;
|
||||
}
|
||||
|
||||
fprintf(stderr, "%s: unknown function name: %s\n", argv[0],
|
||||
argv[1] ? argv[1] : "(there was none)");
|
||||
return 1;
|
||||
|
||||
2
trace.c
2
trace.c
@@ -50,7 +50,7 @@ static int get_trace_fd(int *need_close)
|
||||
return fd;
|
||||
}
|
||||
|
||||
fprintf(stderr, "What does '%s' for GIT_TRACE means ?\n", trace);
|
||||
fprintf(stderr, "What does '%s' for GIT_TRACE mean?\n", trace);
|
||||
fprintf(stderr, "If you want to trace into a file, "
|
||||
"then please set GIT_TRACE to an absolute pathname "
|
||||
"(starting with /).\n");
|
||||
|
||||
32
wrapper.c
32
wrapper.c
@@ -256,3 +256,35 @@ int git_inflate(z_streamp strm, int flush)
|
||||
error("inflate: %s (%s)", err, strm->msg ? strm->msg : "no message");
|
||||
return ret;
|
||||
}
|
||||
|
||||
int odb_mkstemp(char *template, size_t limit, const char *pattern)
|
||||
{
|
||||
int fd;
|
||||
|
||||
snprintf(template, limit, "%s/%s",
|
||||
get_object_directory(), pattern);
|
||||
fd = mkstemp(template);
|
||||
if (0 <= fd)
|
||||
return fd;
|
||||
|
||||
/* slow path */
|
||||
safe_create_leading_directories(template);
|
||||
snprintf(template, limit, "%s/%s",
|
||||
get_object_directory(), pattern);
|
||||
return xmkstemp(template);
|
||||
}
|
||||
|
||||
int odb_pack_keep(char *name, size_t namesz, unsigned char *sha1)
|
||||
{
|
||||
int fd;
|
||||
|
||||
snprintf(name, namesz, "%s/pack/pack-%s.keep",
|
||||
get_object_directory(), sha1_to_hex(sha1));
|
||||
fd = open(name, O_RDWR|O_CREAT|O_EXCL, 0600);
|
||||
if (0 <= fd)
|
||||
return fd;
|
||||
|
||||
/* slow path */
|
||||
safe_create_leading_directories(name);
|
||||
return open(name, O_RDWR|O_CREAT|O_EXCL, 0600);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user