James Moger
2012-08-07 756117adc7f5b4bd21948ede7ab0085aa42d5ccc
Fix to GitServlet to allow pushing to symlinked repositories (issue-116)
3 files modified
64 ■■■■ changed files
docs/04_releases.mkd 3 ●●●● patch | view | raw | blame | history
src/com/gitblit/GitFilter.java 32 ●●●●● patch | view | raw | blame | history
src/com/gitblit/GitServlet.java 29 ●●●●● patch | view | raw | blame | history
docs/04_releases.mkd
@@ -13,8 +13,9 @@
- Do not index blobs in submodules (issue 119)
- Restore original user or team object on failure to update (issue 118)
- Fixes to relative path determination in repository search algorithm for symlinks (issue 116)
- Fix to GitServlet to allow pushing to symlinked repositories (issue 116)
- Repository URL uses `X-Forwarded-Proto` and `X-Forwarded-Port`, if available, for reverse proxy configurations (issue 115)
- Fixes to relative path determination in repository searh algorithm for symlinks (issue 116)
- Output real RAW content, not simulated RAW content (issue 114)
- Fixed Lucene charset encoding bug when reindexing a repository (issue 112)
- Fixed null pointer in LdapUserSerivce if account has a null email address (issue 110)
src/com/gitblit/GitFilter.java
@@ -32,12 +32,29 @@
 */
public class GitFilter extends AccessRestrictionFilter {
    protected final String gitReceivePack = "/git-receive-pack";
    protected static final String gitReceivePack = "/git-receive-pack";
    protected final String gitUploadPack = "/git-upload-pack";
    protected static final String gitUploadPack = "/git-upload-pack";
    protected final String[] suffixes = { gitReceivePack, gitUploadPack, "/info/refs", "/HEAD",
    protected static final String[] suffixes = { gitReceivePack, gitUploadPack, "/info/refs", "/HEAD",
            "/objects" };
    /**
     * Extract the repository name from the url.
     *
     * @param url
     * @return repository name
     */
    public static String getRepositoryName(String value) {
        String repository = value;
        // get the repository name from the url by finding a known url suffix
        for (String urlSuffix : suffixes) {
            if (repository.indexOf(urlSuffix) > -1) {
                repository = repository.substring(0, repository.indexOf(urlSuffix));
            }
        }
        return repository;
    }
    /**
     * Extract the repository name from the url.
@@ -47,14 +64,7 @@
     */
    @Override
    protected String extractRepositoryName(String url) {
        String repository = url;
        // get the repository name from the url by finding a known url suffix
        for (String urlSuffix : suffixes) {
            if (repository.indexOf(urlSuffix) > -1) {
                repository = repository.substring(0, repository.indexOf(urlSuffix));
            }
        }
        return repository;
        return GitFilter.getRepositoryName(url);
    }
    /**
src/com/gitblit/GitServlet.java
@@ -51,7 +51,6 @@
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.UserModel;
import com.gitblit.utils.ClientLogger;
import com.gitblit.utils.FileUtils;
import com.gitblit.utils.HttpUtils;
import com.gitblit.utils.StringUtils;
@@ -94,9 +93,16 @@
            @Override
            public ReceivePack create(HttpServletRequest req, Repository db)
                    throws ServiceNotEnabledException, ServiceNotAuthorizedException {
                ReceivePack rp = super.create(req, db);
                // determine repository name from request
                String repositoryName = req.getPathInfo().substring(1);
                repositoryName = GitFilter.getRepositoryName(repositoryName);
                GitblitReceiveHook hook = new GitblitReceiveHook();
                hook.repositoryName = repositoryName;
                hook.gitblitUrl = HttpUtils.getGitblitURL(req);
                ReceivePack rp = super.create(req, db);
                rp.setPreReceiveHook(hook);
                rp.setPostReceiveHook(hook);
                return rp;
@@ -158,6 +164,8 @@
        protected final Logger logger = LoggerFactory.getLogger(GitblitReceiveHook.class);
        protected String repositoryName;
        protected String gitblitUrl;
        /**
@@ -167,7 +175,7 @@
         */
        @Override
        public void onPreReceive(ReceivePack rp, Collection<ReceiveCommand> commands) {
            RepositoryModel repository = getRepositoryModel(rp);
            RepositoryModel repository = GitBlit.self().getRepositoryModel(repositoryName);
            Set<String> scripts = new LinkedHashSet<String>();
            scripts.addAll(GitBlit.self().getPreReceiveScriptsInherited(repository));
            scripts.addAll(repository.preReceiveScripts);
@@ -195,7 +203,7 @@
                logger.info("skipping post-receive hooks, no refs created, updated, or removed");
                return;
            }
            RepositoryModel repository = getRepositoryModel(rp);
            RepositoryModel repository = GitBlit.self().getRepositoryModel(repositoryName);
            Set<String> scripts = new LinkedHashSet<String>();
            scripts.addAll(GitBlit.self().getPostReceiveScriptsInherited(repository));
            scripts.addAll(repository.postReceiveScripts);
@@ -204,19 +212,6 @@
            // Experimental
            // runNativeScript(rp, "hooks/post-receive", commands);
        }
        /**
         * Returns the RepositoryModel for the repository we are pushing into.
         *
         * @param rp
         * @return a RepositoryModel
         */
        protected RepositoryModel getRepositoryModel(ReceivePack rp) {
            Repository repository = rp.getRepository();
            String repositoryName = FileUtils.getRelativePath(GitBlit.getRepositoriesFolder(), repository.getDirectory());
            RepositoryModel model = GitBlit.self().getRepositoryModel(repositoryName);
            return model;
        }
        /**