From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS31976 209.132.180.0/23 X-Spam-Status: No, score=-4.0 required=3.0 tests=AWL,BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD shortcircuit=no autolearn=ham autolearn_force=no version=3.4.0 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by dcvr.yhbt.net (Postfix) with ESMTP id B161B20951 for ; Tue, 14 Mar 2017 21:46:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751384AbdCNVqy (ORCPT ); Tue, 14 Mar 2017 17:46:54 -0400 Received: from mail-pf0-f172.google.com ([209.85.192.172]:34908 "EHLO mail-pf0-f172.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750944AbdCNVqw (ORCPT ); Tue, 14 Mar 2017 17:46:52 -0400 Received: by mail-pf0-f172.google.com with SMTP id j5so75923010pfb.2 for ; Tue, 14 Mar 2017 14:46:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ecAHAzDWtuJCEoQTKyOlg9cxNieZadvoduTprcx/SVw=; b=IRNis+bgz1HIxUrislPkoP3fCnaMNx6VdFj1xlzcMgJG7GGZDEIKc+g46NnMw8Lqun JAzWxv0JzsiuI1+H2y8QeDMonDH7G7xH2NACHHd//iHwroabKxAkMAbnwINcNT2xxORn gI+eP93wKKXVFWxnVnySG3XYBCFsxkFtje1va3zZ4Tvys9rkSOomAN4zg7FDs4upMt2e FKIgZiw3536dyMONQ/6nCkBmaYrZEXV9r5e7uUlWgJbSMbD2PqWHl3CGw+PBXhvlFjR0 zFxNzhB3ZqvDgue4EaVtL3x5vfqzkGk8YS9zPnjDr67mlNNFEWEsIoJLByL7+sfzJPE5 bX+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ecAHAzDWtuJCEoQTKyOlg9cxNieZadvoduTprcx/SVw=; b=TRUSmp+GSraB1qlMopursYqLSLumbmA4pk1WyBDLIn2PoCWDzWxshNG6UdLKlTSh0C E6SJ6Hg6d77/b1tSsuFlnpiNLadi2TGFAzGZP5zGEJZhh81HKfVjK5S3rYx6PQM0zWg9 MgEPhd4w7BqwbNfhNO3sSOod2B6Vq4TFuQEpZWeBlENKmU8aBD6WykgAWLLFvQXjpx7C vDTb2aKkRk6HxpEgHEOGUyki3EzhS6Z2x0CczNpZpgCO5PCLsf0T3taKgvJ5lDFrvE59 ngOv02sTmwjcRCgXsuMgRUYhYB0ec0wGy8fJmx2omKy6rvVO0Qwc/BBEqdCXPd3X04rt 21Zg== X-Gm-Message-State: AFeK/H00aZnHWD5pNsTqog+AY2hB0+JswraCx4nKm4oEOO/A6AL4FvUXttkuOErjkCmgGz23 X-Received: by 10.99.1.87 with SMTP id 84mr24901210pgb.57.1489528011055; Tue, 14 Mar 2017 14:46:51 -0700 (PDT) Received: from localhost ([2620:0:1000:5b10:8559:2c0d:dab3:f802]) by smtp.gmail.com with ESMTPSA id 187sm40329038pff.17.2017.03.14.14.46.49 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Tue, 14 Mar 2017 14:46:50 -0700 (PDT) From: Stefan Beller To: sbeller@google.com, gitster@pobox.com Cc: git@vger.kernel.org, bmwill@google.com, novalis@novalis.org, sandals@crustytoothpaste.net, hvoigt@hvoigt.net, jrnieder@gmail.com, ramsay@ramsayjones.plus.com Subject: [PATCH 01/19] connect_work_tree_and_git_dir: safely create leading directories Date: Tue, 14 Mar 2017 14:46:24 -0700 Message-Id: <20170314214642.7701-2-sbeller@google.com> X-Mailer: git-send-email 2.12.0.rc1.49.g0cfd38c5f6.dirty In-Reply-To: <20170314214642.7701-1-sbeller@google.com> References: <20170309221543.15897-1-sbeller@google.com> <20170314214642.7701-1-sbeller@google.com> Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org In a later patch we'll use connect_work_tree_and_git_dir when the directory for the gitlink file doesn't exist yet. This patch makes connect_work_tree_and_git_dir safe to use for both cases of either the git dir or the working dir missing. To do so, we need to call safe_create_leading_directories[_const] on both directories. However this has to happen before we construct the absolute paths as real_pathdup assumes the directories to be there already. So for both the config file in the git dir as well as the .git link file we need to a) construct the name b) call SCLD c) get the absolute path d) once a-c is done for both we can consume the absolute path to compute the relative path to each other and store those relative paths. The implementation provided here puts a) and b) for both cases first, and then performs c and d after. One of the two users of 'connect_work_tree_and_git_dir' already checked for the directory being there, so we can loose that check as connect_work_tree_and_git_dir handles this functionality now. Signed-off-by: Stefan Beller --- dir.c | 32 +++++++++++++++++++++----------- submodule.c | 11 ++--------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/dir.c b/dir.c index 4541f9e146..6f52af7abb 100644 --- a/dir.c +++ b/dir.c @@ -2728,23 +2728,33 @@ void untracked_cache_add_to_index(struct index_state *istate, /* Update gitfile and core.worktree setting to connect work tree and git dir */ void connect_work_tree_and_git_dir(const char *work_tree_, const char *git_dir_) { - struct strbuf file_name = STRBUF_INIT; + struct strbuf gitfile_sb = STRBUF_INIT; + struct strbuf cfg_sb = STRBUF_INIT; struct strbuf rel_path = STRBUF_INIT; - char *git_dir = real_pathdup(git_dir_); - char *work_tree = real_pathdup(work_tree_); + char *git_dir, *work_tree; - /* Update gitfile */ - strbuf_addf(&file_name, "%s/.git", work_tree); - write_file(file_name.buf, "gitdir: %s", - relative_path(git_dir, work_tree, &rel_path)); + /* Prepare .git file */ + strbuf_addf(&gitfile_sb, "%s/.git", work_tree_); + if (safe_create_leading_directories_const(gitfile_sb.buf)) + die(_("could not create directories for %s"), gitfile_sb.buf); + + /* Prepare config file */ + strbuf_addf(&cfg_sb, "%s/config", git_dir_); + if (safe_create_leading_directories_const(cfg_sb.buf)) + die(_("could not create directories for %s"), cfg_sb.buf); + git_dir = real_pathdup(git_dir_); + work_tree = real_pathdup(work_tree_); + + /* Write .git file */ + write_file(gitfile_sb.buf, "gitdir: %s", + relative_path(git_dir, work_tree, &rel_path)); /* Update core.worktree setting */ - strbuf_reset(&file_name); - strbuf_addf(&file_name, "%s/config", git_dir); - git_config_set_in_file(file_name.buf, "core.worktree", + git_config_set_in_file(cfg_sb.buf, "core.worktree", relative_path(work_tree, git_dir, &rel_path)); - strbuf_release(&file_name); + strbuf_release(&gitfile_sb); + strbuf_release(&cfg_sb); strbuf_release(&rel_path); free(work_tree); free(git_dir); diff --git a/submodule.c b/submodule.c index 3b98766a6b..45e93a1d55 100644 --- a/submodule.c +++ b/submodule.c @@ -1445,8 +1445,6 @@ void absorb_git_dir_into_superproject(const char *prefix, /* Not populated? */ if (!sub_git_dir) { - char *real_new_git_dir; - const char *new_git_dir; const struct submodule *sub; if (err_code == READ_GITFILE_ERR_STAT_FAILED) { @@ -1469,13 +1467,8 @@ void absorb_git_dir_into_superproject(const char *prefix, sub = submodule_from_path(null_sha1, path); if (!sub) die(_("could not lookup name for submodule '%s'"), path); - new_git_dir = git_path("modules/%s", sub->name); - if (safe_create_leading_directories_const(new_git_dir) < 0) - die(_("could not create directory '%s'"), new_git_dir); - real_new_git_dir = real_pathdup(new_git_dir); - connect_work_tree_and_git_dir(path, real_new_git_dir); - - free(real_new_git_dir); + connect_work_tree_and_git_dir(path, + git_path("modules/%s", sub->name)); } else { /* Is it already absorbed into the superprojects git dir? */ char *real_sub_git_dir = real_pathdup(sub_git_dir); -- 2.12.0.rc1.49.g0cfd38c5f6.dirty