File: PackageRestoreConsent.cs
Web Access
Project: src\src\nuget-client\src\NuGet.Core\NuGet.PackageManagement\NuGet.PackageManagement.csproj (NuGet.PackageManagement)
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

#nullable disable

using System;
using System.Globalization;
using NuGet.Common;
using NuGet.Configuration;

namespace NuGet.PackageManagement
{
    public class PackageRestoreConsent
    {
        private const string EnvironmentVariableName = "EnableNuGetPackageRestore";
        private const string PackageRestoreSection = "packageRestore";
        private const string PackageRestoreConsentKey = "enabled";

        // the key to enable/disable automatic package restore during build.
        private const string PackageRestoreAutomaticKey = "automatic";

        private readonly Configuration.ISettings _settings;
        private readonly Common.IEnvironmentVariableReader _environmentReader;
        private readonly ConfigurationDefaults _configurationDefaults;

        public PackageRestoreConsent(Configuration.ISettings settings)
            : this(settings, EnvironmentVariableWrapper.Instance)
        {
        }

        public PackageRestoreConsent(Configuration.ISettings settings, Common.IEnvironmentVariableReader environmentReader)
            : this(settings, environmentReader, ConfigurationDefaults.Instance)
        {
        }

        public PackageRestoreConsent(Configuration.ISettings settings, Common.IEnvironmentVariableReader environmentReader, ConfigurationDefaults configurationDefaults)
        {
            _settings = settings ?? throw new ArgumentNullException(nameof(settings));
            _environmentReader = environmentReader ?? throw new ArgumentNullException(nameof(environmentReader));
            _configurationDefaults = configurationDefaults ?? throw new ArgumentNullException(nameof(configurationDefaults));
        }

        public bool IsGranted
        {
            get
            {
                var envValue = _environmentReader.GetEnvironmentVariable(EnvironmentVariableName);

                return IsGrantedInSettings || IsSet(envValue, false);
            }
        }

        public bool IsGrantedInSettings
        {
            get
            {
                var settingsValue = SettingsUtility.GetValueForAddItem(_settings, PackageRestoreSection, PackageRestoreConsentKey);
                if (string.IsNullOrWhiteSpace(settingsValue))
                {
                    settingsValue = _configurationDefaults.DefaultPackageRestoreConsent ?? string.Empty;
                }

                return IsSet(settingsValue, true);
            }
            set
            {
                _settings.AddOrUpdate(PackageRestoreSection, new AddItem(PackageRestoreConsentKey, value.ToString(CultureInfo.InvariantCulture)));
                _settings.SaveToDisk();
            }
        }

        public bool IsAutomatic
        {
            get
            {
                var settingsValue = SettingsUtility.GetValueForAddItem(_settings, PackageRestoreSection, PackageRestoreAutomaticKey);
                return IsSet(settingsValue, IsGrantedInSettings);
            }
            set
            {
                _settings.AddOrUpdate(PackageRestoreSection, new AddItem(PackageRestoreAutomaticKey, value.ToString(CultureInfo.InvariantCulture)));
                _settings.SaveToDisk();
            }
        }

        private static bool IsSet(string value, bool defaultValue)
        {
            if (string.IsNullOrWhiteSpace(value))
            {
                return defaultValue;
            }

            value = value.Trim();

            bool boolResult;
            int intResult;

            var result = ((bool.TryParse(value, out boolResult) && boolResult) ||
                          (int.TryParse(value, NumberStyles.Number, CultureInfo.InvariantCulture, out intResult) && (intResult == 1)));

            return result;
        }
    }
}