public void Perform(AssetList list, BaseObject source = null, BaseObject target = null)
            {
                switch (_mode)
                {
                case Mode.Source:
                    if (source != null)
                    {
                        if (_operator == Operator.Add)
                        {
                            list.Add(source);
                        }
                        else
                        {
                            list.Remove(source);
                        }
                    }
                    break;

                case Mode.Target:
                    if (target != null)
                    {
                        if (_operator == Operator.Add)
                        {
                            list.Add(target);
                        }
                        else
                        {
                            list.Remove(target);
                        }
                    }
                    break;

                case Mode.AssetList:
                    if (_assetList != null)
                    {
                        if (_operator == Operator.Add)
                        {
                            list.AddRange(_assetList);
                        }
                        else
                        {
                            list.RemoveRange(_assetList);
                        }
                    }
                    break;
                }
            }
Ejemplo n.º 2
0
        internal static bool CheckoutAndValidateVCSFiles(IEnumerable <string> files)
        {
            // We're only interested in files that would be under VCS, i.e. project
            // assets or local packages. Incoming paths might use backward slashes; replace with
            // forward ones as that's what Unity/VCS functions operate on.
            files = files.Select(f => f.Replace('\\', '/')).Where(Provider.PathIsVersioned).ToArray();

            var assetList = new AssetList();

            assetList.AddRange(files.Select(Provider.GetAssetByPath));

            // Verify that all the files are also in assetList
            // This is required to ensure the copy temp files to destination loop is only working on version controlled files
            // Provider.GetAssetByPath() can fail i.e. the asset database GUID can not be found for the input asset path
            foreach (var assetPath in files)
            {
                var foundAsset = assetList.Where(asset => (asset?.path == assetPath));
                if (!foundAsset.Any())
                {
                    Debug.LogErrorFormat("[API Updater] Files cannot be updated (failed to add file to list): {0}", assetPath);
                    APIUpdaterManager.ReportExpectedUpdateFailure();
                    return(false);
                }
            }

            var checkoutTask = Provider.Checkout(assetList, CheckoutMode.Exact);

            checkoutTask.Wait();

            // Verify that all the files we need to operate on are now editable according to version control
            // One of these states:
            // 1) UnderVersionControl & CheckedOutLocal
            // 2) UnderVersionControl & AddedLocal
            // 3) !UnderVersionControl
            var notEditable = assetList.Where(asset => asset.IsUnderVersionControl && !asset.IsState(Asset.States.CheckedOutLocal) && !asset.IsState(Asset.States.AddedLocal));

            if (!checkoutTask.success || notEditable.Any())
            {
                Debug.LogErrorFormat("[API Updater] Files cannot be updated (failed to check out): {0}", notEditable.Select(a => a.fullName + " (" + a.state + ")").Aggregate((acc, curr) => acc + Environment.NewLine + "\t" + curr));
                APIUpdaterManager.ReportExpectedUpdateFailure();
                return(false);
            }

            return(true);
        }
Ejemplo n.º 3
0
        static AssetList GetStatusForceUpdate(List <string> fromPaths)
        {
            var task = Provider.Status(fromPaths.ToArray());

            task.Wait();
            if (!task.success)
            {
                return(null);
            }

            // Status task might return more items in the list (e.g. meta files),
            // and return them out of order too. Make sure to return proper sized
            // and in-order list back.
            var taskResultList = task.assetList;
            var result         = new AssetList {
                Capacity = fromPaths.Count
            };

            result.AddRange(fromPaths.Select(path => taskResultList.SingleOrDefault(a => a.path == path)));
            return(result);
        }
Ejemplo n.º 4
0
        void UpgradeMaterials()
        {
            // upgrade material template assets
            var assetList = new AssetList();

            assetList.AddRange(
                AssetDatabase.FindAssets($"t:{nameof(PhysicsMaterialTemplate)}")
                .Select(guid => AssetDatabase.GUIDToAssetPath(guid))
                .Select(path => new Asset(path))
                );
            if (assetList.Count > 0)
            {
                if (IsEditable(assetList, m_Failures))
                {
                    foreach (var asset in assetList)
                    {
                        if (!IsEditable(asset, m_Failures))
                        {
                            continue;
                        }

                        // material templates are upgraded in OnEnable(), so it should be sufficient to merely load them
                        var materialTemplate = AssetDatabase.LoadAssetAtPath <PhysicsMaterialTemplate>(asset.path);
                        EditorUtility.SetDirty(materialTemplate);
                        m_Successes.AddEntry(asset.path, string.Empty);
                    }
                }
            }

            // upgrade prefabs
            assetList.Clear();
            foreach (var guid in AssetDatabase.FindAssets("t:Prefab"))
            {
                var prefabAssetPath = AssetDatabase.GUIDToAssetPath(guid);

                var prefab = AssetDatabase.LoadAssetAtPath <GameObject>(prefabAssetPath);

                var shapeComponents = prefab.GetComponentsInChildren <PhysicsShapeAuthoring>(true);
                if (shapeComponents.Length == 0)
                {
                    continue;
                }

                var asset = new Asset(prefabAssetPath);
                if (!IsEditable(asset, m_Failures))
                {
                    continue;
                }

                assetList.Add(asset);
            }

            if (assetList.Count > 0)
            {
                if (IsEditable(assetList, m_Failures))
                {
                    var upgradedAssets = new HashSet <Asset>();
                    foreach (var asset in assetList)
                    {
                        UpgradePrefabAsset(asset, assetList, upgradedAssets, m_Successes, m_Failures);
                    }
                }
            }

            // update scene objects
            EditorSceneManager.SetActiveScene(EditorSceneManager.NewScene(NewSceneSetup.EmptyScene));
            foreach (var guid in AssetDatabase.FindAssets("t:Scene"))
            {
                var scenePath = AssetDatabase.GUIDToAssetPath(guid);

                var asset = new Asset(scenePath);
                if (!IsEditable(asset, m_Failures))
                {
                    continue;
                }

                Scene scene;
                try { scene = EditorSceneManager.OpenScene(scenePath); }
                catch (Exception e)
                {
                    m_Failures.AddEntry(asset.path, $"{e.Message}\n\n{e.StackTrace}");
                    continue;
                }
                EditorSceneManager.SetActiveScene(scene);

                var succcess = true;
                if (IsEditable(new AssetList {
                    new Asset(scenePath)
                }, m_Failures))
                {
                    var upgradedAny = false;
                    foreach (
                        var sceneObject in scene.GetRootGameObjects()
                        .Where(go => go.GetComponentsInChildren <PhysicsShapeAuthoring>(true).Any())
                        )
                    {
                        try
                        {
                            UpgradePrefabInstance(sceneObject);
                            upgradedAny = true;
                        }
                        catch (Exception e)
                        {
                            succcess = false;
                            m_Failures.AddEntry(
                                $"{scenePath}::{AnimationUtility.CalculateTransformPath(sceneObject.transform, sceneObject.transform.root)}",
                                $"{e.Message}\n\n{e.StackTrace}"
                                );
                        }
                    }

                    if (upgradedAny)
                    {
                        EditorSceneManager.SaveScene(scene);
                    }
                }

                if (succcess)
                {
                    m_Successes.AddEntry(scenePath, string.Empty);
                }

                EditorSceneManager.SetActiveScene(EditorSceneManager.NewScene(NewSceneSetup.EmptyScene));
                EditorSceneManager.CloseScene(scene, true);
            }
        }
        private QueryResult ParseAssetListQueryResult(XmlElement element, Query query) {
            var list = new AssetList();
            var total = int.Parse(element.GetAttribute("total"));

            var assetnodes = element.SelectNodes("Asset");

            list.AddRange(from XmlElement assetnode in assetnodes select ParseAssetNode(assetnode));

            if(query.ParentRelation != null) {
                list = TreeAssetListByAttribute(list, query.ParentRelation);
            }

            return new QueryResult(list, total, query);
        }